PDA

View Full Version : حرفه ای: دلیل این خطا چیه



h_jafarnezhad
شنبه 28 شهریور 1394, 07:27 صبح
سلام دلیل خطای زیر چیه
Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Excel.Range'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00020846-0000-0000-C000-000000000046}' failed due to the following error: The RPC server is unavailable. (Exception from HRESULT: 0x800706BA).
چه طوری باید رفعش کنم

اینم کد برنامه

while (Class1.datareader1.Read())
{
j++;
//Class1.con1.Close();
//Class1.con1.Open();
//Class1.com1.CommandText = "USE [" + s + "] insert into tb" + dataGridView1.Rows[i].Cells[2].Value + " (Field1, Field12, Field14) values('" + Class1.datareader1.GetValue(0).ToString() + "','" + Class1.datareader1.GetValue(1).ToString() + "','" + Class1.datareader1.GetValue(2).ToString() + "')";
//Class1.com1.ExecuteNonQuery();
//Class1.con1.Close();
Range r1 = sheet.get_Range("A" + j.ToString(), "A" + j.ToString());
r1.Value2 = Class1.datareader1.GetValue(0).ToString();
Range r2 = sheet.get_Range("B" + j.ToString(), "B" + j.ToString());
r2.Value2 = Class1.datareader1.GetValue(1).ToString();
Range r3 = sheet.get_Range("C" + j.ToString(), "C" + j.ToString());
r3.Value2 = Class1.datareader1.GetValue(2).ToString();
richTextBox2.Text = "لطفا صبر کنید فال در حال آماده سازی می باشد";
}
richTextBox2.Text = "فایل برای کد پستی" + richTextBox1.Lines[i] + "ایجاد شد در مسیر" + textBox2.Text + ":\\" + textBox3.Text + "\\" + s + "\\" + richTextBox1.Lines[i] + ".xls";
book.SaveAs(textBox2.Text + ":\\" + textBox3.Text + "\\" + s + "\\" + richTextBox1.Lines[i] + ".xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode. xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
app.Quit();
i++;
}
به این خط که میرسه خطا میده
Range r1 = sheet.get_Range("A" + j.ToString(), "A" + j.ToString());

combo_ci
شنبه 28 شهریور 1394, 08:49 صبح
کلا اینجا کارا عجلیه ای نیست!!!!!!!!!

وقتی یه خطایی تو برنامتون رخ میده دقیقا متن خطلا رو تو اینترنت سرچ کنین تا متوجه بشین خطا از کجاست
https://www.google.com/search?client=opera&q=Unable+to+cast+COM+object+of+type+%27System.__Co mObject%27+to+interface+type+%27Microsoft.Office.I nterop.Excel.Range%27.+This+operation+failed+becau se+the+QueryInterface+call+on+the+COM+component+fo r+the+interface+with+IID+%27%7B00020846-0000-0000-C000-000000000046%7D%27+failed+due+to+the+following+err or%3A+The+RPC+server+is+unavailable.+(Exception+fr om&sourceid=opera&ie=UTF-8&oe=UTF-8
مثلا الان اولبن لینکی که گوگل در این مورد میاره اینه
https://social.msdn.microsoft.com/Forums/en-US/ff08d994-123e-46a4-8b5b-cfefb7a804d8/error-when-reading-values-from-excel-using-interop?forum=exceldev

و کامل در مورد خطا نوشته ...طبق اون چیزی که من خوندم احتمالا خطا توی خوندن اطلاعات از اکسل یا کستینگ موقع نوشتن اطلاعات داری

h_jafarnezhad
شنبه 28 شهریور 1394, 08:52 صبح
میشه دقیق توضیح بدی برنامه کار میکنه وقتی j برابر 45 میشه خطا میده چه طوری حلش کنم

h_jafarnezhad
شنبه 28 شهریور 1394, 09:02 صبح
هیچ کدوم از این لینک ها باز نمیشه

محمد رضا فاتحی
شنبه 28 شهریور 1394, 09:14 صبح
شاید 45 اندیس آرایس و شما اون مقدار تو آرایتون نیست...برای تست j++ رو بیار آخر حلقه

h_jafarnezhad
شنبه 28 شهریور 1394, 09:19 صبح
این کد کل دکمس

private void button2_Click(object sender, EventArgs e)
{

Class1.con.Open();
Class1.com.Connection = Class1.con;

string s = textBox1.Text;

Directory.CreateDirectory(textBox2.Text + ":\\" + textBox3.Text);
int i = 0;
foreach (string txt in richTextBox1.Lines)
{
if ((richTextBox1.Lines[i].Length) != 0)
{
Directory.CreateDirectory(textBox2.Text + ":\\" + textBox3.Text + "\\" + s);
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook book = app.Workbooks.Add(XlSheetType.xlWorksheet);
Microsoft.Office.Interop.Excel.Worksheet sheet = book.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
;
app.Visible = false;
Range rng1 = sheet.get_Range("A1", "A1");
rng1.Value2 = "شماره";
rng1.Font.Bold = true;
Range rng2 = sheet.get_Range("B1", "B1");
rng2.Value2 = "نام شهر";
rng2.Font.Bold = true;
Range rng3 = sheet.get_Range("C1", "C1");
rng3.Value2 = "کد پستی";
rng3.Font.Bold = true;
Class1.com3.Connection = Class1.con;
Class1.con.Close();
Class1.con.Open();
Class1.com3.CommandText = "SELECT * FROM [mobile_list] WHERE (city = '" + s + "') and (codeposti='" + richTextBox1.Lines[i] + "') ";
Class1.datareader1 = Class1.com3.ExecuteReader();
int j = 1;
while (Class1.datareader1.Read())
{
j++;

Range r1 = sheet.get_Range("A" + j.ToString(), "A" + j.ToString());
r1.Value2 = Class1.datareader1.GetValue(0).ToString();
Range r2 = sheet.get_Range("B" + j.ToString(), "B" + j.ToString());
r2.Value2 = Class1.datareader1.GetValue(1).ToString();
Range r3 = sheet.get_Range("C" + j.ToString(), "C" + j.ToString());
r3.Value2 = Class1.datareader1.GetValue(2).ToString();
richTextBox2.Text = "لطفا صبر کنید فال در حال آماده سازی می باشد";
}
richTextBox2.Text = "فایل برای کد پستی" + richTextBox1.Lines[i] + "ایجاد شد در مسیر" + textBox2.Text + ":\\" + textBox3.Text + "\\" + s + "\\" + richTextBox1.Lines[i] + ".xls";
book.SaveAs(textBox2.Text + ":\\" + textBox3.Text + "\\" + s + "\\" + richTextBox1.Lines[i] + ".xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode. xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
sheet = Nothing;
book.Close();
app.Quit();



i++;
}
else
{
i++;
}
}
Class1.con.Close();
}

combo_ci
شنبه 28 شهریور 1394, 12:20 عصر
اینا که لینک های سرچ گوگل هست عینا خطا رو توی گوگل سرچ کن اولین گزینه رو انتخاب کن ...اونجا دقیقا نوشته

combo_ci
شنبه 28 شهریور 1394, 12:22 عصر
i++;
}
else
{
i++;
}
الان این کد یعنی چی؟ در هر دوحالت i++ انجام میشه! خوب اگه اینطوره شرط چرا؟

pbm_soy
شنبه 28 شهریور 1394, 13:41 عصر
دوست عزیز این موردی که گفتید خطای منطقی ایجاد خواهد کرد!

ولی در مورد خطای ایشون
پیام خطا میگه در تبدیل نوعها مشکل دارد شماذسعی کردید یک شی را تبدیل کنید ذخیره کنید در یک متغییر از نوع کلاس abstract ویا interface
پس اون r1 را سعی کنید از نوع دیگری بگیرید معمولا یک کلاس پیاده سازی شده یا همان immpelement شده از آنهم باید موجود باشد

تواون صفحه راهنما هم تعریف r1 را عوض کرده!

h_jafarnezhad
شنبه 28 شهریور 1394, 16:48 عصر
i++;
}
else
{
i++;
}
الان این کد یعنی چی؟ در هر دوحالت i++ انجام میشه! خوب اگه اینطوره شرط چرا؟


سلام این به خاطر اینه که ممکنه تو لیست اون وسط ها یکی خالی باشه برای این که اون رو درنظر نگیره و بره رکورد بعدی این کار رو کردم

h_jafarnezhad
شنبه 28 شهریور 1394, 16:50 عصر
دوست عزیز این موردی که گفتید خطای منطقی ایجاد خواهد کرد!

ولی در مورد خطای ایشون
پیام خطا میگه در تبدیل نوعها مشکل دارد شماذسعی کردید یک شی را تبدیل کنید ذخیره کنید در یک متغییر از نوع کلاس abstract ویا interface
پس اون r1 را سعی کنید از نوع دیگری بگیرید معمولا یک کلاس پیاده سازی شده یا همان immpelement شده از آنهم باید موجود باشد

تواون صفحه راهنما هم تعریف r1 را عوض کرده!


سلام آخه برنامه کار میکنه و فایل ها رو هم ایجاد میکنه ولی وقتی اندیس j به 45 میرسه این خطا رو میده
جالب اینجاست که اگه خروجی تکست بگیرم اصلا خطایی نمیده

pbm_soy
سه شنبه 31 شهریور 1394, 00:27 صبح
داده های اندیس ۴۵ چه فرقی با داده های سطرهای بالاتر دارد؟!

برای امتحان کردن سعی کنید وقتی روی اندیس ۴۵ خطا داد شمارنده اندیس را اضافه کنید و اندیسهای بعدی را امتحان کنید و یا وقتی خطا داد اندیس را یک کنید و دوباره از اول شروع کنید ببینید چی میشه؟ البته این قضیه صرفا برای تست گرفتن است و توی حلقه تکرار بینهایت گیرنکنید!

خطاهای درحین اجرا همیشه بخاطر دادههای ورودی و یا رفتار ااشتباه کاربر و عوامل بیرونی پیش میاد پس ایراد از دستورات نمیتواند باشد!

aliasghar2
سه شنبه 31 شهریور 1394, 11:30 صبح
معمولا کار کردن با Com های ماکروسافت اینجور دردسر هارو داره و همش ارورای عجیب غریب میده به نظر من واسه کار با اکسل با کامپوننت Aspose.Cell استفاده کنی خیلی بهتره هم کارکردن باهاش راحت تر و هم اینجور خطا هارو نمیده