我遇到有关将记录插入数据库的问题, 错误说:“无法将值NULL插入列'OrderNo',表'Receipt.dbo.Orders';列不允许空值。插入失败。然后语句已被终止”,但当我检查我的代码时,我似乎找不到任何错误。有人能帮助我吗?提前谢谢你:
这是我的一组代码:
- 用于保存销售订单 -
private void SaveSalesOrder(string status)
{
int nOrder = 0;
CloseConnection();
OpenConnection();
trnOrder = cn.BeginTransaction();
SqlCommand cmdInsert = new SqlCommand();
try
{
cmdInsert.Connection = cn;
cmdInsert.Transaction = trnOrder;
cmdInsert.CommandType = CommandType.Text;
cmdInsert.CommandText =
"INSERT INTO Orders " +
"(OrderDate, CustomerNo, CustomerName, CustomerAddress, PurchaseOrderNo, AgentName, Status) " +
"VALUES ('" +
dtpOrderDate.Value.Date.ToString() + "', '" +
txtCustomerNo.Text + "', '" +
txtCustomerName.Text + "', '" +
txtCustomerAddress.Text + "', '" +
txtPONo.Text + "', '" +
cboAgentName.Text + "', '" +
status + "'); " +
"SELECT TOP 1 OrderNo FROM Orders " +
"ORDER BY OrderNo DESC;";
nOrder = Convert.ToInt16(cmdInsert.ExecuteScalar().ToString());
for (int nRow = 0;
nRow <= dsDetail.Tables["OrderDetails"].Rows.Count - 1;
nRow++)
{
double dQuantity = Convert.ToDouble(dsDetail.Tables["OrderDetails"].
Rows[nRow]["Quantity"].ToString());
string strUnit = dsDetail.Tables["OrderDetails"].
Rows[nRow]["Unit"].ToString();
int nProductNo = Convert.ToInt16(dsDetail.Tables["OrderDetails"].
Rows[nRow]["ProductNo"].ToString());
string strProductName = dsDetail.Tables["OrderDetails"].
Rows[nRow]["ProductName"].ToString();
string strProductSize = dsDetail.Tables["OrderDetails"].
Rows[nRow]["ProductSize"].ToString();
string strPackagingInside = dsDetail.Tables["OrderDetails"].
Rows[nRow]["PackagingInside"].ToString();
double dSellingDiscount = Convert.ToDouble(dsDetail.Tables["OrderDetails"].
Rows[nRow]["SellingDiscount"].ToString());
double dSellingPrice = Convert.ToDouble(dsDetail.Tables["OrderDetails"].
Rows[nRow]["SellingPrice"].ToString());
double nAmount = Convert.ToDouble(dsDetail.Tables["OrderDetails"].
Rows[nRow]["Amount"].ToString());
SqlCommand cmdInsertDetail = new SqlCommand();
cmdInsertDetail.Connection = cn;
cmdInsertDetail.Transaction = trnOrder;
cmdInsertDetail.CommandType = CommandType.Text;
cmdInsertDetail.CommandText =
"INSERT INTO OrderDetails " +
"(OrderNo, PackagingOutside, Quantity, Unit, ProductNo, ProductName, " +
"ProductSize, PackagingInside, SellingDiscount, SellingPrice, Amount) " +
"VALUES ('" +
nOrder + "', '" +
dPackagingOutside + "', '" +
dQuantity + "', '" +
strUnit + "', '" +
nProductNo + "', '" +
strProductName + "', '" +
strProductSize + "', '" +
strPackagingInside + "', '" +
dSellingDiscount + "', '" +
dSellingPrice + "', '" +
nAmount + "')";
cmdInsertDetail.ExecuteNonQuery();
}
trnOrder.Commit();
if (status == "OK")
{
MessageBox.Show("Transaction has been saved!", "Success",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Transaction has been voided!", "Void Transaction",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (SqlException ex)
{
trnOrder.Rollback();
MessageBox.Show(ex.Message);
}
finally
{
cn.Close();
}
}
private void btnSave_Click(object sender, EventArgs e)
{
if (txtCustomerNo.Text == "")
{
MessageBox.Show("Please select a customer first.", "Empty", MessageBoxButtons.OK, MessageBoxIcon.Error);
btnSearchCustomer.Focus();
return;
}
if (grdDetails.Rows.Count < 1)
{
MessageBox.Show("Please select a product first.", "Empty",
MessageBoxButtons.OK, MessageBoxIcon.Error);
btnProductSearch.Focus();
return;
}
SaveSalesOrder("OK");
groupCustomer(false);
groupProduct(false);
CSalesInv.EnableDisable(this, false);
CloseConnection();
InitializeOrder();
lblTotal.Text = "";
}
答案 0 :(得分:1)
从数据库生成错误。数据库中的OrderNo列设置为不允许NULL。我认为你想要一些独特的ID,但是改为勾选“No NULLs”。
您使用的数据库是什么?
答案 1 :(得分:0)
您未在查询中指定OrderNo。除非这是IDENTITY
字段,否则它不会自动增量。
你可以做两件事:
OrderId
设置为允许空值您可能还希望使用SQL Parameterized queries
来阻止SQL注入。
cmdInsertDetail.CommandText = "INSERT INTO YourTable (CustomerNumber) VALUES (@CustomerNo)";
cmdInsertDetail.Parameters.AddWithValue("@CustomerNo", txtCustomerNo.Text);
这比构建随机SQL
字符串更有效。
答案 2 :(得分:0)
一个很酷的主意是您可以返回标识号,以使您知道该行已添加到哪个行号上。是的,如果您希望在某些情况下缺少订单号,则需要将订单号设置为允许表中为空。
https://qualitybusinessintelligence.com/Code/ASPDOTNET/Insert-Into-Multiple-Tables.pdf
在这里,我将标识号(OrderID)添加到标签中以返回输出,这告诉我添加行时它在哪一行:(只是想提供帮助)
[CODE]
"', " + " '" + emp.SignedName +
"', " + " '" + emp.SignedDate + "') SELECT SCOPE_IDENTITY(); ");
[/CODE]