错误显示“将数据类型varchar转换为数字时出错。”
这是我的一组代码:
private void btnSearchCustomer_Click(object sender, EventArgs e)
{
//Get Customer Records
DataSet dsCustomer = new DataSet();
dsCustomer = GetRecords("Customers");
frmBasicSearch newSearch = new frmBasicSearch();
newSearch.myDataSet = dsCustomer;
newSearch.ShowDialog();
int myRowPosition = newSearch.myRowPosition;
if (myRowPosition != -1) //will display the value inside the textboxes
{
//concuntinated values
this.txtCustomerNo.Text = dsCustomer.Tables["Customers"].Rows[myRowPosition]["CustomerNo"].ToString();
this.txtCustomerName.Text = dsCustomer.Tables["Customers"].Rows[myRowPosition]["CustomerName"].ToString();
this.txtCustomerAddress.Text = dsCustomer.Tables["Customers"].Rows[myRowPosition]["CustomerAddress"].ToString();
groupProduct(true); //this will activate the buttons from the Product Section
}
cn.Close();
cn.Open();
SqlCommand cmdInsert = new SqlCommand();
cmdInsert.Connection = cn;
cmdInsert.Transaction = trnOrder;
cmdInsert.CommandType = CommandType.Text;
cmdInsert.CommandText =
"INSERT INTO ShoppingCart " +
"(OrderDate, CustomerNo, CustomerName, CustomerAddress, PurchaseOrderNo, AgentNo, AgentName, InvoiceNo, TotalAmount, OrderStatus) " +
"VALUES ('" +
dtpOrderDate.Value.Date.ToString() + "', '" +
txtCustomerNo.Text + "', '" +
txtCustomerName.Text + "', '" +
txtCustomerAddress.Text + "', '" +
DBNull.Value + "', '" +
DBNull.Value + "', '" +
DBNull.Value + "', '" +
DBNull.Value + "', '" +
DBNull.Value + "', '" +
"''Void'); " +
"SELECT TOP 1 ShoppingCartNo FROM ShoppingCart " +
"ORDER BY ShoppingCartNo DESC;";
cmdInsert.ExecuteNonQuery();
cn.Close();
}
突出显示的错误部分是
int nShoppingCart = Convert.ToInt16(cmdInsert.ExecuteScalar().ToString());
我似乎无法知道问题出在哪里?谢谢你的帮助
这是我的数据模式,
ShoppingCartNo在主键中,并且身份由1
自动判定
答案 0 :(得分:1)
ExecuteScalar
通常用于SQL部件返回某些行的情况。插入时请尝试使用ExecuteNonQuery
。
然后使用ExecuteScalar
选择部分。应该工作。
为什么 -
现在,您有2个查询 - 当您在Management studio中运行2个查询时 - 您会得到'N行受影响'和&你的ShoppingCartNo
。根据您当前的代码,仅返回第一部分(由于ExecuteScalar
),这会导致类型转换错误。
答案 1 :(得分:1)
ExecuteScalar
执行SELECT语句并返回firest返回行的第一列。对于INSERT语句,请使用ExecuteNonQuery。它将返回一个包含插入行数的整数,因此不需要转换,只需写入
int nShoppingCart = cmdInsert.ExecuteNonQuery();
错误来自将字符串'NULL'插入数字列TotalAmount
。
"'" + DbNull.Value + "'"
将导致'NULL'
(可能,我没有检查,但它肯定是一个字符串,而不是数值)。
您不需要将NULL值插入可以保存NULL值的列中。只需不要插入这些列,jjust插入包含数据的列。
之后,使用提到的SCOPE-IDENTITY()
答案 2 :(得分:1)
首先:这不是检索自动递增密钥的正确方法。请改用SCOPE_IDENTITY()
,或使用INSERT的OUTPUT子句。从多个角度来看,你的做法是不正确的:
那么为什么不只使用SCOPE_IDENTITY()
?