ebrahim.rayatparvar
دوشنبه 27 مهر 1394, 19: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 میده.
مرسی از همه
تو برنامه ایی من از روش فرستادن یک 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 میده.
مرسی از همه