PDA

View Full Version : حرفه ای: مشکل فرستادن DataTable به بانک اطلاعاتی



ebrahim.rayatparvar
دوشنبه 27 مهر 1394, 18:43 عصر
سلام خدمت دوستای خوبم.
تو برنامه ایی من از روش فرستادن یک dataTable به صورت یکجا به پارامتر SP استفاده کردم در چند جایی استفاده کردم و مشکلی وجود نداشت ولی در یکی از این DataTable ها این دور یک فیلد Pictrur گذاشتم که اول از نوع Byte[] گرفته بودم چون خودتون میدونین زمانی که عکسی رو میخواین تبدیل به باینری بکنید نوع برگشتی اون میشه آرایه ای از Byte که تو پارامتر SP فرستاده میشه خیلی راحت ولی زمانی که تو DataTable این کار رو می کنم و نوع ستون رو هم از نوع Byte[] گرفتم و حالا هم از نوع SqlBinary کد به صورت زیر هم زده شده تریس هم کردم مقدار داخل DataTable قرار میگیره
کد :



private void AddCertification()
{
try
{
if (gridViewCertification.RowCount > 0)
{


var dt = new DataTable();
dt.Columns.Add("CodeDriverCertification", typeof (int));
dt.Columns.Add("CodeDriver", typeof (int));
dt.Columns.Add("DateExport");
dt.Columns.Add("DateFinish");
dt.Columns.Add("KindCertification", typeof (string));
dt.Columns.Add("NumberCertification", typeof (string));
dt.Columns.Add("Picture",typeof(SqlBinary));
dt.Clear();

gridViewCertification.FocusedRowHandle = 0;
for (int i = 0; i < gridViewCertification.RowCount; i++)
{
dt.Rows.Add();
if (string.IsNullOrWhiteSpace(gridViewCertification.G etRowCellValue(i,
gridViewCertification.Columns["CodeDriverCertification"]).ToString()))
dt.Rows[i][@"CodeDriverCertification"] = DBNull.Value;
else
dt.Rows[i][@"CodeDriverCertification"] =
int.Parse(gridViewCertification.GetRowCellValue(i,
gridViewCertification.Columns["CodeDriverCertification"]).ToString());

if (string.IsNullOrWhiteSpace(gridViewCertification.G etRowCellValue(i, gridViewCertification.Columns["CodeDriver"])
.ToString())
)
dt.Rows[i][@"CodeDriver"] = DBNull.Value;
else
dt.Rows[i][@"CodeDriver"] =
int.Parse(
gridViewCertification.GetRowCellValue(i, gridViewCertification.Columns["CodeDriver"])
.ToString());

dt.Rows[i][@"KindCertification"] =
gridViewCertification.GetRowCellValue(i, gridViewCertification.Columns["KindCertification"])
.ToString();
dt.Rows[i][@"NumberCertification"] =
gridViewCertification.GetRowCellValue(i,
gridViewCertification.Columns["NumberCertification"]).ToString();

dt.Rows[i][@"DateExport"] =
DateTime.Parse(
gridViewCertification.GetRowCellValue(i, gridViewCertification.Columns["DateExport"])
.ToString()).Date;

dt.Rows[i][@"DateFinish"] =
DateTime.Parse(
gridViewCertification.GetRowCellValue(i, gridViewCertification.Columns["DateFinish"])
.ToString()).Date;

var byteImage = (Image)gridViewCertification.GetRowCellValue(i, gridViewCertification.Columns["Picture"]);

dt.Rows[i][@"Picture"] = ClsImageAndScreenAndIp.ImageToByte(byteImage);



}
_blCls.DriverCertification = null;
_blCls.DriverCertification = dt;
_blCls.BlAddDriverCertification();
}


}
catch (SqlException ex)
{
ShowMessage.Show(ex.Message, "خطا در پایگاه داده", ShowMessage.PersionMessageBoxButton.Ok,
ShowMessage.PersionMessageBoxIcon.Error);
}
catch (Exception ex)
{
ShowMessage.Show(ex.Message, "خطا در برنامه", ShowMessage.PersionMessageBoxButton.Ok,
ShowMessage.PersionMessageBoxIcon.Error);
}
}


کد تو لایه Dal :


public string DalAddDriverCertification()
{
_con.Connect();
SqlCommand cmd = new SqlCommand("Utility.Add_Driver", _con.Conn);
cmd.CommandType = CommandType.StoredProcedure;
//================================================== =========
cmd.Parameters.Add("@Kind", SqlDbType.TinyInt).Value = 4;
cmd.Parameters.Add("@DriverCertification", SqlDbType.Structured).Value = DriverCertification;
cmd.ExecuteNonQuery();
_con.Disconnect();
return "1";
}


ولی پیغام خطای زیر رو میده :



String or binary data would be truncated.
The data for table-valued parameter "@DriverCertification" doesn't conform to the table type of the parameter. SQL Server error is: 8152, state: 10
The statement has been terminated.


@DriverCertification رو که میبینید یکی پارامتری هست که DataTable به داخلش تو لایه Dal میبینید داره ریخته میشه.

نکته این هم هست که Sql Profiler که میزنم تو SQL تریس کنم مقداری رو نمایش نمیده یه جوری همون اول مقدار رو که میخواد SP بگیره Error میده.

مرسی از همه

am_al_59
دوشنبه 27 مهر 1394, 19:01 عصر
اون خطایی که شما میگیری برای اینه که طول یک یا چند تا از داده هایی که میخوای در دیتابیس بریزی بیشتر از طول تعریف شده برای فیلد مربوطه هست

ebrahim.rayatparvar
سه شنبه 28 مهر 1394, 15:02 عصر
درسته مهندس جان و مشکل من هم همینه که عکسه رو باینری میکنم میفرستم و سمت sql هم varbinary(max) گرفتم