【问题标题】:SQL Error: String or binary data would be truncated. The statement has been terminatedSQL 错误:字符串或二进制数据将被截断。该语句已终止
【发布时间】:2010-12-09 19:00:28
【问题描述】:

就像我在尝试通过 UI 更新我的 DataGridView 时遇到的任何其他问题一样。这是我得到的错误:

SQLException 未处理。字符串或二进制数据将被截断。声明已终止。

现在这是我要更新的列列表:

  1. ShipTrackingNumber (nvarchar(100), null)

  2. ShipMethodTransmitted (nvarchar(50), null)

  3. DateShipTransmitProcessed(日期时间,空)

  4. ShipmentProcessedBy (nvarchar(50), null)

  5. 严重(nchar(1),null)

  6. ShipTransmitStatus (nvarchar(50), null)

现在您获得了列列表及其属性。以下是更新这些列的代码:

public void SaveDataSet(DataTable table)
{

  foreach (DataRow row in table.Rows)
  {

    SqlCommand cmd2 = new SqlCommand(
    "update dbo.JobStatus SET ShipTrackingNumber = '@trackingNumber', ShipMethodTransmitted = '@TransmitMethod', DateShipTransmitProcessed = @DateProcessed, ShipmentProcessedBy = '@ProcessedBy', Critical = '@Critical', ShipTransmitStatus = '@TransmitStatus' WHERE JobTableId = @JobTableId ", _mySqlConnec);


    //Updated the parameters to the SQL Query!
    cmd2.Parameters.Add(new SqlParameter("@trackingNumber", row["Tracking#"].ToString()));
    cmd2.Parameters.Add(new SqlParameter("@TransmitMethod", row["TransmitMethod"].ToString()));
    cmd2.Parameters.Add(new SqlParameter("@DateProcessed", row["DateProcessed"]));
    cmd2.Parameters.Add(new SqlParameter("@ProcessedBy", row["ProcesssedBy"].ToString()));
    cmd2.Parameters.Add(new SqlParameter("@Critical", row["Critical"].ToString()));
    cmd2.Parameters.Add(new SqlParameter("@TransmitStatus", row["Status"].ToString()));
    cmd2.Parameters.Add(new SqlParameter("@JobTableId", row["JobID"].ToString()));

    cmd2.Connection = _mySqlConnec;
    _mySqlConnec.Open();
    cmd2.ExecuteNonQuery();
    _mySqlConnec.Close();
  } 
}

}

任何人都可以在这方面帮助我。谢谢!

【问题讨论】:

  • 行中的内容[“关键”]?如果不止一个字符,则您的错误是正确的。
  • 请更新您的代码以使用 Using 语句。就目前而言,您很可能会超载连接池并获得有趣的错误,例如无法创建与 sql server 的连接...

标签: asp.net sql sql-server


【解决方案1】:

您不需要在任何参数周围加上引号。

把你的 sql 改成:

update dbo.JobStatus SET ShipTrackingNumber = @trackingNumber, 
ShipMethodTransmitted = @TransmitMethod, 
DateShipTransmitProcessed = @DateProcessed, 
ShipmentProcessedBy = @ProcessedBy, Critical = @Critical, 
ShipTransmitStatus = @TransmitStatus WHERE JobTableId = @JobTableId 

它基本上是试图将字符串“@Critical”插入到导致截断错误的 nchar(1) 中。

【讨论】:

  • 我以为你打败了我 :) 我在编辑格式后才看到你的
  • phttt,我比你们俩都快了 8 分钟,我的只是一个评论;)
【解决方案2】:

您传入的其中一个值比您尝试插入的列长。如果您可以向我们提供出错的行数据样本,我们可以告诉您是哪一个。

例如,如果您尝试使用值“yes”更新您的critical 列,您会看到上述错误。

【讨论】:

  • 您是否确切知道数据网格中的哪一行导致了错误?
  • 追踪编号:5545254,TransmitMethod:FedEX,DateProcessed:1/1/1900,ProcessedBy:ME,Critical:Y,状态:“”
  • 我不是 mySQL 人,您是否必须在更新语句中引用 nvarchar 列的变量,您在 datetime 周围没有引号?
  • 是的,因为 DateTime 不需要(我猜):-|
猜你喜欢
  • 2013-03-19
  • 1970-01-01
  • 2012-01-31
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多