PDA

View Full Version : سوال: مشکل insert داخل دیتابیس با دیکشنری



hercool
شنبه 05 مرداد 1392, 17:28 عصر
سلام دوستان
من یه مشکل با ذخیره داده هام در دیتابیس با دستور insert دارم
من یک دیکشنری دارم که کلید و مقدارش رو از نوع استرینگ مشخص کردم حالا زمانی که می خوام مقادیر داخل دیکشنری رو با استفاده از foreach پیمایش کنم و بریزم داخل دیتابیس دچار مشکل میشم
نکته چون key ها نامشون با فیلد های دیتابیس یکی نیست قبلش چکش باید بکنم تا اطلاعات درست وارد بشه اما مشکل دارم بخشی از کد رو می زارم تا کمکم کنید

foreach(var dic in dictionary){
SqlCommand com=new SqlCommand("INSERT INTO MainBalancesheet(ids,MBcode,MBdate,MB_TotalAssets, MB_TotalHolder)
VALUES(@ids,@MBcode,@MBdate,@MB_TotalAssets,@MB_To talHolder)", con);
if(dic.Key=="txbTss"){ com.Parameters.Add(new SqlParameter("@ids", 10));}
if(dic.Key=="txbsets"){ com.Parameters.Add(new SqlParameter("@MBcode", 12));}
if(dic.Key=="txbTotalAssets"){ com.Parameters.Add(new SqlParameter("@MBdate", 2013/07/27));}
if(dic.Key=="txbTotalAssets"){ com.Parameters.Add(new SqlParameter("@MB_TotalAssets", dic.Value));}
if(dic.Key=="txbTotaHolders"){ com.Parameters.Add(new SqlParameter("@MB_TotalHolder", dic.Value));}
com.ExecuteNonQuery();


}


چند تا ارور میداد که با تصحیحشون هم بازم مشکلات پشت سر هم ایجاد می شد
برای مثال

http://barnamenevis.org/showthread.php?87475-Must-declare-the-scalar-variable-code


http://barnamenevis.org/showthread.php?398445-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%B9%DA%A9%D8%B3-%D8%A8%D8%A7-%DA%A9%D8%AF-insert&highlight=new+SqlParameter

hercool
شنبه 05 مرداد 1392, 19:05 عصر
این لینک هم پیدا کردم اما چاره ساز نشد

http://barnamenevis.org/showthread.php?190609-%D8%B7%D8%B1%D8%B2-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-stored-procdure-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE

خواستم از switch استفاده کنم که مشکلش اینه که توش نمیشه از دستور command کار کرد چون با ابجکت مشکل داره

hercool
یک شنبه 06 مرداد 1392, 08:44 صبح
دوستان من هر کار کردم بازم مشکلم پا برجاست کد ها رو میزارم هر کاری می کنم ارور میگیره

دیکشنری اصلی که دارم و دیتا توش هست
var dictionary = new Dictionary<string, string>();
این بخش اصلی کد
SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommand command = new SqlCommand("ejra");
command.Connection = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=bourse;Integrated Security=True");
command.Connection.Open();
command.CommandType = CommandType.StoredProcedure; adapter.SelectCommand = command;
List<int> ls = new List<int>();
string[] boxval = new string[17];
boxval[0]="10";
boxval[1] = "123";
boxval[2] = "";
boxval[11] = "";
boxval[16] = "";
boxval[6] = "";
foreach (var dic in dictionary)
{
if (dic.Key == "txbTotalAssets") { boxval[3] = dic.Value; }
else if (dic.Key == "txbTotalStockHoldersEquity") { boxval[4] = dic.Value; }
else if (dic.Key == "txbInventories") { boxval[5] = dic.Value; }
else if (dic.Key == "txbTradeNotesAndAccountsReceivable") { boxval[7] = dic.Value; }
else if (dic.Key == "txbOtherNotesAndAccountsReceivable") { boxval[8] = dic.Value; }
else if (dic.Key == "txbTotalCurrentAssets") { boxval[9] = dic.Value; }
else if (dic.Key == "txbTotalLiabilities") { boxval[10] = dic.Value; }
else if (dic.Key == "txbLoanPayable") { boxval[12] = dic.Value; }
else if (dic.Key == "txbLongTermNotesAndAccountsPayable") { boxval[13] = dic.Value; }
else if (dic.Key == "txbTotalCurrentLiabilities") { boxval[14] = dic.Value; }
else if (dic.Key == "txbCashAndCashEquivalents") { boxval[15] = dic.Value; }
else { };
}int i;
for (i = 0; i < boxval.Length; i++) {

// command.Parameters.Add("@MB_TotalAssets", SqlDbType.NVarChar).Value = dic.Value; ;

command.Parameters.Add(new SqlParameter("@ids", boxval[0]));
MessageBox.Show(""+ boxval[0].GetType());
command.Parameters.Add(new SqlParameter("@MBcode", boxval[1]));
command.Parameters.Add(new SqlParameter("@MBdate", boxval[2]));
command.Parameters.Add(new SqlParameter("@MB_TotalAssets", boxval[3]));
command.Parameters.Add(new SqlParameter("@MB_TotalStockHolder", boxval[4]));
command.Parameters.Add(new SqlParameter("@MB_Inventories", boxval[5]));
// command.Parameters.Add(new SqlParameter("@MB_AccountsReceivable", boxval[6]));
command.Parameters.Add(new SqlParameter("@MB_TradeNotes", boxval[7]));
command.Parameters.Add(new SqlParameter("@MB_OtherNotes", boxval[8]));
command.Parameters.Add(new SqlParameter("@MB_CurrentAssets", boxval[9]));
command.Parameters.Add(new SqlParameter("@MB_TotalLiabilities", boxval[10]));
// command.Parameters.Add(new SqlParameter("@MB_Longtermdebt", boxval[11]));
command.Parameters.Add(new SqlParameter("@MB_LoanPayable", boxval[12]));
command.Parameters.Add(new SqlParameter("@MB_AccountsPayable", boxval[13]));
command.Parameters.Add(new SqlParameter("@MB_CurrentLiabilities", boxval[14]));
command.Parameters.Add(new SqlParameter("@MB_CashEquivalents", boxval[15]));
// command.Parameters.Add(new SqlParameter("@MB_NetWorkingCapital", boxval[16]));



command.ExecuteNonQuery();
}

این تاپیک ها مربوط به مشکل من میشه

http://stackoverflow.com/questions/7123974/getting-an-error-converting-data-type-nvarchar-to-int-from-application-c-but

http://www.codeproject.com/Questions/241806/Cannot-Convert-Datatype-nvarchar-into-int-error

http://stackoverflow.com/questions/3878796/c-sharp-error-error-converting-nvarchar-datatype-to-int-help

مقادیر هم دیتابیس هم پروسیجر رو هم تغییر دادم اما بازم نشد
این کد پروسیجر
ALTER PROCEDURE [dbo].[ejra]
-- Add the parameters for the stored procedure here

@ids varchar,
@MBcode varchar,
@MBdate varchar,
@MB_TotalAssets varchar,
@MB_TotalStockHolder varchar,
@MB_Inventories varchar,
@MB_AccountsReceivable varchar,
@MB_TradeNotes varchar,
@MB_OtherNotes varchar,
@MB_CurrentAssets varchar,
@MB_TotalLiabilities varchar,
@MB_Longtermdebt varchar,
@MB_LoanPayable varchar,
@MB_AccountsPayable varchar,
@MB_CurrentLiabilities varchar,
@MB_CashEquivalents varchar,
@MB_NetWorkingCapital varchar
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
INSERT INTO MainBalancesheet(ids,MBcode,MBdate,MB_TotalAssets, MB_TotalStockHolder,MB_Inventories,MB_AccountsRece ivable,MB_TradeNotes,MB_OtherNotes,MB_CurrentAsset s,MB_TotalLiabilities,MB_Longtermdebt,MB_LoanPayab le,MB_AccountsPayable,MB_CurrentLiabilities,MB_Cas hEquivalents,MB_NetWorkingCapital) VALUES(@ids,@MBcode,@MBdate,@MB_TotalAssets,@MB_To talStockHolder,@MB_Inventories,@MB_AccountsReceiva ble,@MB_TradeNotes,@MB_OtherNotes,@MB_CurrentAsset s,@MB_TotalLiabilities,@MB_Longtermdebt,@MB_LoanPa yable,@MB_AccountsPayable,@MB_CurrentLiabilities,@ MB_CashEquivalents,@MB_NetWorkingCapital)
END

این کد ها رو هم میزارم که اینا رو هم تست کردم اما بازم نشد
command.Parameters.Add(new SqlParameter("@MB_NetWorkingCapital", boxval[16]));
command.Parameters.AddWithValue("@MB_CurrentLiabilities", Convert.ToInt32(boxval[14]));
command.Parameters.AddWithValue("@ids", SqlDbType.SmallInt).Value=boxval[0];
if (dic.Key == "txbTotalAssets") { boxval[3] =Convert.ToInt32( dic.Value); }
command.Parameters.Add(new SqlParameter("@MB_CashEquivalents", boxval[15]));

هر خط بالا رو کلی ساختم فقط بحث نمونه بود

هر کاری کردم به هر حال نشد ممنون میشم کمکم کنید

Mahmoud.Afrad
یک شنبه 06 مرداد 1392, 17:09 عصر
متن دقیق خطا رو چرا نذاشتید.

فکر کنم اشکال از SP هست. همه پارامترهای ورودی SP رو از نوع varchar گرفتی در حالی که احتمالا همه ستونهای جدول از این نوع نیستند. نوع پارامترها رو متناسب نوع ستونها انتخاب کن.