我有一个带有以下字段的SQL表(在括号中输入)
这些都不接受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(因此我没有出现错误),但后来当我收到外键错误时我意识到出了问题。
感谢您的大力帮助,非常感谢。
答案 0 :(得分:1)
问题在于存储过程的输入参数数据类型(在没有发布proc签名的情况下很难判断),或者可能是在C#中将值添加到SqlParameterCollection中。
首先要检查的是3个字符串字段:
的定义与表和存储过程之间的最大长度相同。 SQL Server存储过程的一个技术细微差别是它们默默地截断值。这意味着只要表和输入参数之间的最大长度(以及所有数据类型,实际上)匹配,就不可能得到" 字符串或二进制数据将被截断"错误(除非您在进入proc之后但在INSERT / UPDATE语句之前操作值。)
如果这些都匹配则问题不能成为程序。接下来要检查的是使用SqlParameterCollection的AddWithValue
方法。我记得在某个地方读到它并不总是按字符串长度的方式工作。尝试将这3个字段更改为直接Add
来自new SqlParameter("@idLocation", SqlDbType.VarChar, 255)
的调用,您可以在其中指定每个字段的确切最大长度。
答案 1 :(得分:0)
我会使用SQL事件探查器来查看传递给存储过程的数据。否则,很难知道哪个变量超出了预期的参数。