我想将数据插入到我的tbl_Transaction_Master表中。 这是我的数据库表tbl_Transaction_Master
我对数据库插入命令的查询是
SqlCommand cmd2 = new SqlCommand("insert into tbl_Transaction_Master(Supplier_ID,Order_Price,Unique_ID,Supplier_Name,He_Is_a,Transaction_Date) values ('" + WebUserID + "','" + Session["Order_Price"] + "','" + Session["WebUserid"] + "','"+User+"','WebCustomer',getdate()); SELECT SCOPE_IDENTITY()", conn);
int temp = cmd2.ExecuteNonQuery();
Session["order_ID"] = temp;
我收到上面提到的错误。
答案 0 :(得分:6)
您的代码中存在许多问题,而不仅仅是引发当前异常的问题。
首先:您的文字字段具有精确的尺寸,您不能插入多于字段大小的字符。我们对于为SupplierName传递的值一无所知,但是字符串WebCustomer
是11个字符,并且您尝试将其插入到仅有10个字符的空间字段中。
第二次:使用nchar
表示您的字段始终填充空格以达到所需的长度。当然,这对于大量记录来说效率很低,更不用说在需要显示数据时需要裁掉那些空格。
第三次:ExecuteNonQuery返回受命令影响的行数。在这种情况下,它始终为1,您没有得到SELECT SCOPE_IDENTITY()
的返回值。使用ExecuteScalar。
第四:您的某些字段是数字字段,您为它们插入字符串。这意味着数据库引擎尝试将它们转换回正确的数据类型。通常,对于整数,您可以自由地离开,但使用浮点数时,由于代码的语言环境设置与数据库的语言环境设置之间的差异导致数据类型不匹配错误的可能性更高。在下一点修复它。
第五:您应该使用参数而不是字符串连接。这避免了Sql Injection hack或由字符串自动转换回数值引起的解析错误。与代码中使用的区域设置和数据库设置不匹配将导致错误。使用参数指定类型,不要转换值。数据库引擎很高兴。
所以......(在更改为nvarchar之后和检查值的长度之后)
string cmdText = @"insert into tbl_Transaction_Master
(Supplier_ID,Order_Price,Unique_ID,
Supplier_Name,He_Is_a,Transaction_Date) values
(@webid, @price,@sessionid,@user,'WebCust.',getdate());
SELECT SCOPE_IDENTITY()";
SqlCommand cmd2 = new SqlCommand(cmdText, conn);
cmd2.Parameters.Add("@webid", SqlDbType.Int).Value = WebUserID
cmd2.Parameters.Add("@price", SqlDbType.Decimal).Value = Session["Order_Price"];
cmd2.Parameters.Add("@sessionid", SqlDbType.Int).Value = Session["WebUserid"];
cmd2.Parameters.Add("@user", SqlDbType.NVarChar).Value =User;
int temp = Convert.ToInt32(cmd2.ExecuteScalar());
Session["order_ID"] = temp;
答案 1 :(得分:0)
您正在表列中插入超出列长度的值。这就是错误存在的原因。根据相应的列长度检查要插入表中的每个值的长度。
答案 2 :(得分:0)
您可能正在插入超过指定大小的文本。例如,对于Supplier_Name,您指定的nchar为20.如果您尝试插入大于20个字符的值。你会收到这个错误。
尝试更改数据类型的大小以解决此问题。
答案 3 :(得分:0)
两件事。
一:发生错误是因为您试图将数据放入大于允许的字段中,因此对于nchar(20)它将接受20或更少的输入并将其填充到20个章程(Varchar将携带来了上限但没有填充数据并节省空间。)
二:将数值插入数据库时使用参数是一种更安全的建议。
答案 4 :(得分:0)
您插入的字符更多,但定义的字符更少。 例如:
column datatype is varchar(5) but you are inserting 6 characters.