使用ADO.NET存储过程 - 字符串或二进制数据将被截断

时间:2014-07-03 02:10:09

标签: c# sql sql-server

我有一个带有以下字段的SQL表(在括号中输入)

  • id(varchar(255))主键
  • dateStarted(date)
  • dateFirstPayement(date)
  • 金额(小数)
  • numberPayments(int)
  • telNum(varchar(20))外键
  • VIN(varchar(255))外键

这些都不接受NULL。

我正在尝试从C#程序中插入一些值,这是我如何从WPF表单中获取值。

id
 string id = textBox_id.Text;

startingDate,firstPaymentDate
DateTime startDate = Convert.ToDateTime(datePicker_startDate1.SelectedDate);
DateTime dateFirstP= Convert.ToDateTime(datePicker_firstP.SelectedDate);

telNum,NIV
string telNum = comboBox_telNum.SelectedValue.ToString();
string VIN = comboBox_VIM.SelectedValue.ToString();

金额,numberPayments
Decimal amount = Convert.ToDecimal(textBox_amount.Text);
int numberPayments = Convert.ToInt32(textBox_numberPayment.Text);

这是我的C#代码,用于执行插入值的存储过程:

        SqlConnection connection = new SqlConnection();
        SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();

        builder.DataSource = "D106213";
        builder.InitialCatalog = "ML645";
        builder.IntegratedSecurity = true;

        connection.ConnectionString = builder.ConnectionString; 
        connection.Open();

        SqlCommand newLocation = new SqlCommand("nouvelleLocation", connection);
        newLocation.CommandType = CommandType.StoredProcedure;

        newLocation.Parameters.AddWithValue("@idLocation", id);
        newLocation.Parameters.AddWithValue("@dateDebut", startDate);
        newLocation.Parameters.AddWithValue("@datePremierPaiement", dateFirstP);
        newLocation.Parameters.AddWithValue("@montantPremierPaiement", amount);
        newLocation.Parameters.AddWithValue("@nombrePaiement", numberPayments);
        newLocation.Parameters.AddWithValue("@numTel", telNum);
        newLocation.Parameters.AddWithValue("@NIV", VIN);

        newLocation.ExecuteNonQuery();

当我尝试通过WPF表格插入信息时,这是我得到的错误:

System.Data.SqlClient.SqlException (0x80131904): String or binary data would be truncated

连接到数据库的代码很好,因为它适用于使用相同ConnectionString的所有其他过程。为了清晰起见,我没有发布所有内容,但它是try / catch块中的包装来处理异常。

我假设SQL和C#中的数据类型不相等,其中一个导致问题。我确定数据的大小(例如:字符串)不超过SQL中定义的最大长度。

对于凌乱的文本格式,很抱歉,我是使用StackOverflow的新手,我还没有掌握它。

非常感谢你们的帮助,祝你们度过愉快的一天。

修改

现在已修复。我的问题是在存储过程中,我反转/交换了两个值(telNum和VIN),因此它试图在telNum列中插入VIN值。 telNum最初只接受VARCHAR(20),VIN长达23个字符..

我几乎错过了它,我最初将数据类型更改为VARCHAR(50)用于telNum(因此我没有出现错误),但后来当我收到外键错误时我意识到出了问题。

感谢您的大力帮助,非常感谢。

2 个答案:

答案 0 :(得分:1)

问题在于存储过程的输入参数数据类型(在没有发布proc签名的情况下很难判断),或者可能是在C#中将值添加到SqlParameterCollection中。

首先要检查的是3个字符串字段:

  • id(varchar(255))
  • telNum(varchar(20))
  • VIN(varchar(255))

的定义与表和存储过程之间的最大长度相同。 SQL Server存储过程的一个技术细微差别是它们默默地截断值。这意味着只要表和输入参数之间的最大长度(以及所有数据类型,实际上)匹配,就不可能得到" 字符串或二进制数据将被截断"错误(除非您在进入proc之后但在INSERT / UPDATE语句之前操作值。)

如果这些都匹配则问题不能成为程序。接下来要检查的是使用SqlParameterCollection的AddWithValue方法。我记得在某个地方读到它并不总是按字符串长度的方式工作。尝试将这3个字段更改为直接Add来自new SqlParameter("@idLocation", SqlDbType.VarChar, 255)的调用,您可以在其中指定每个字段的确切最大长度。

答案 1 :(得分:0)

我会使用SQL事件探查器来查看传递给存储过程的数据。否则,很难知道哪个变量超出了预期的参数。