C# 使用一个查询插入到两个表中
我的代码出了什么问题,我试图将两个查询合并为一个查询。但是第二个查询不起作用,我已经按照这个链接的答案进行了操作,但是我认为我的查询不起作用,我的代码中是否遗漏了什么C# 使用一个查询插入到两个表中,c#,mysql,C#,Mysql,我的代码出了什么问题,我试图将两个查询合并为一个查询。但是第二个查询不起作用,我已经按照这个链接的答案进行了操作,但是我认为我的查询不起作用,我的代码中是否遗漏了什么 string sql = "INSERT INTO tbladdbook(fBookTitle,fAuthor,fBookYr,fEdition,fPublication,fAccNo,fCallNo,fCategory,fBarCodeNo,fCurrentCopies) VALUES('"
string sql = "INSERT INTO tbladdbook(fBookTitle,fAuthor,fBookYr,fEdition,fPublication,fAccNo,fCallNo,fCategory,fBarCodeNo,fCurrentCopies) VALUES('"
+ txtTITLE.Text + "','"
+ txTAUTHOR.Text + "','"
+ txtBOOKYR.Text + "','"
+ txtEDITION.Text + "','"
+ txtPUBLICATION.Text + "','"
+ txtACCESSNO.Text + "','"
+ txtCALLNO.Text + "','"
+ txtCATEGORY.SelectedItem + "','"
+ txtBARCODE.Text + "','"
+ txtCOPIES.Text + "'); INSERT INTO tbltruecopies(fBookTitle,fAuthor,fBarCodeNo,fTrueCopies) VALUES('"
+ txtTITLE.Text + "','"
+ txTAUTHOR.Text + "','"
+ txtBARCODE.Text + "','"
+ txtCOPIES.Text + "')";
cfgotcall.inputQ(sql);
表定义:用于tbladdbook
fBookTitle varchar
fAuthor varchar
fEdition varchar
fBookYr varchar
fPublication varchar
fAccNo varchar
fCallNo varchar
fCategory varchar
fBarCodeNo varchar
fCurrentCopies float
表定义:用于tbltrue
fBookTitle varchar
fAuthor varchar
fBarCodeNo bigint
fTrueCopies bigint
旧代码和工作代码:
string sql = "INSERT INTO tbladdbook(fBookTitle,fAuthor,fBookYr,fEdition,fPublication,fAccNo,fCallNo,fCategory,fBarCodeNo,fCurrentCopies) VALUES('"
+ txtTITLE.Text + "','"
+ txTAUTHOR.Text + "','"
+ txtBOOKYR.Text + "','"
+ txtEDITION.Text + "','"
+ txtPUBLICATION.Text + "','"
+ txtACCESSNO.Text + "','"
+ txtCALLNO.Text + "','"
+ txtCATEGORY.SelectedItem + "','"
+ txtBARCODE.Text + "','"
+ txtCOPIES.Text + "')";
cfgotcall.inputQ(sql);
sql = "INSERT INTO tbltruecopies(fBookTitle,fAuthor,fBarCodeNo,fTrueCopies) VALUES('"
+ txtTITLE.Text + "','"
+ txTAUTHOR.Text + "','"
+ txtBARCODE.Text + "','"
+ txtCOPIES.Text + "')";
cfgotcall.inputQ(sql);
提莫船长问我是否能够使用参数重写
这是一个相对容易的操作;但是,我是为SQL Server编写的,与MySql命令可能略有不同,并且我不使用数据层使用的cfgotcall
方法(这是冷融合吗?),因此我将用ADO编写
在本例中,我只是用SQL变量替换了values
子句中的所有值,基本上用前面的@重复使用列名,因此列fBookTitle
被分配了值@fBookTitle
。然后我们可以通过parameters.AddWithValue()
方法将这些参数分配给命令
对象。对于上述@fBookTitle值,调用将是cmd.Parameters.AddWithValue(“@Title”,txtTITLE.Text”)代码>我注意到第二个查询中使用的变量都在第一个查询中,但不是相反;因此,我将首先构建executeQry2
,然后我们可以简单地更改CommandText
,并添加额外的参数。
使用参数的一个问题是,您需要添加具有正确类型的值,因此在数据库中添加一个BigInt值需要添加为相应的C#type Int64
我所能做的就是展示如何通过SQL Server的ADO来完成这项工作,并且您可以修改需要完成的工作。如果找不到与参数一起工作的cfgotcall
,则可以将其更改为与MySql一起使用,MySql的语法与SQL Server的语法几乎相同
string Qry1 = "INSERT INTO tbladdbook(fBookTitle,fAuthor,fBookYr,fEdition,fPublication,fAccNo,fCallNo,fCategory,fBarCodeNo,fCurrentCopies) VALUES (@Title, @Author, @BookYr, @Edition, @Publication, @AccNo, @CallNo, @Category, @BarCode, @Copies)";
string Qry2 = "INSERT INTO tbltruecopies(fBookTitle, fAuthor, fBarCodeNo, fTrueCopies) VALUES (@Title, @Author, @Barcode, @Copies)";
using (SqlConnection conn = new SqlConnection(connectionstring)) {
conn.Open();
using (SqlCommand cmd = new SqlCommand()) {
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = Qry2;
cmd.Parameters.AddWithValue("@Title", txtTITLE.Text);
cmd.Parameters.AddWithValue("@Author", txTAUTHOR.Text);
cmd.Parameters.AddWithValue("@Barcode", Int64.parse(txtBARCODE.Text));
cmd.Parameters.AddWithValue("@Copies", Int64.parse(txtCOPIES.Text));
try { cmd.ExecuteNonQuery(); }
catch (Exception) { /* your error handling */ }
cmd.CommandText = Qry1;
cmd.Parameters.AddWithValue("@BookYr", txtBOOKYR.Text);
cmd.Parameters.AddWithValue("@Edition", txtEDITION.Text);
cmd.Parameters.AddWithValue("@Publication", txtPUBLICATION.Text);
cmd.Parameters.AddWithValue("@AccNo", txtACCESSNO.Text);
cmd.Parameters.AddWithValue("@CallNo", txtCALLNO.Text);
cmd.Parameters.AddWithValue("@Category", txtCATEGORY.SelectedItem);
try { cmd.ExecuteNonQuery(); }
catch (Exception) { /* your error handling */ }
}
conn.Close();
}
Tetsuya Yamamoto建议将其转换为存储过程
这在SQL Server上是一项非常简单的任务,但我不知道MySql的实现;很抱歉,您将得到我在查询分析器或SSMS中输入的内容,这很可能也会被转换为MySql
这个过程的语法将非常简单,因为我们要做的就是将2个查询包装在其中
CREATE PROCEDURE usp_addBookAndCopies (
@Title VARCHAR(100),
@Author VARCHAR(100),
@BookYr VARCHAR(100),
@Edition VARCHAR(100),
@Publication VARCHAR(100),
@AccNo VARCHAR(100),
@CallNo VARCHAR(100),
@Category VARCHAR(100),
@BarCode BIGINT,
@Copies BIGINT
) AS
BEGIN
INSERT tbladdbook ( fBookTitle, fAuthor, fBookYr, fEdition, fPublication,
fAccNo, fCallNo, fCategory, fBarCodeNo, fCurrentCopies )
VALUES (@Title, @Author, @BookYr, @Edition, @Publication,
@AccNo, @CallNo, @Category, @BarCode, @Copies )
INSERT tbltruecopies ( fBookTitle, fAuthor, fBarCodeNo, fTrueCopies)
VALUES (@Title, @Author, @Barcode, @Copies)
END
GO
创建存储过程后,我们需要修改原始代码,删除2个INSERT查询,并用调用该过程的一个命令替换它们。我们还将更改命令类型,以反映我们正在运行过程而不是文本命令
// Not Needed: string Qry1 = "INSERT INTO tbladdbook..."
// Not Needed: string Qry2 = "INSERT INTO tbltruecopies..."
using (SqlConnection conn = new SqlConnection(connectionstring)) {
conn.Open();
using (SqlCommand cmd = new SqlCommand()) {
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure; // Changed
cmd.CommandText = "usp_addBookAndCopies"; // Changed
cmd.Parameters.AddWithValue("@Title", txtTITLE.Text);
cmd.Parameters.AddWithValue("@Author", txTAUTHOR.Text);
cmd.Parameters.AddWithValue("@Barcode", Int64.parse(txtBARCODE.Text));
cmd.Parameters.AddWithValue("@Copies", Int64.parse(txtCOPIES.Text));
cmd.Parameters.AddWithValue("@BookYr", txtBOOKYR.Text);
cmd.Parameters.AddWithValue("@Edition", txtEDITION.Text);
cmd.Parameters.AddWithValue("@Publication", txtPUBLICATION.Text);
cmd.Parameters.AddWithValue("@AccNo", txtACCESSNO.Text);
cmd.Parameters.AddWithValue("@CallNo", txtCALLNO.Text);
cmd.Parameters.AddWithValue("@Category", txtCATEGORY.SelectedItem);
try { cmd.ExecuteNonQuery(); }
catch (Exception) { /* your error handling */ }
}
conn.Close();
}
我的评论
查看实际语句和代码,这似乎是在向各种库中添加书籍。有一个图书表(tbladdbook)和另一个图书副本表(tbltruecopies),两个表之间唯一不同的是,副本将反映当前手头的副本数量,但计数类型不同;一个是Float
,另一个是BigInt
。我的观点是这两个应该是同一类型的,我真的不认为这些值会超过32位整数(如果不是16位的话)的容量是现实的。更不用说Float和Double只是近似值
这是一个相当长的答案,我的老眼睛可能有一两个语法错误。请原谅我,并让我知道任何错误或建议,我很乐意为您更新。您的INSERT
语句中是否真的有省略号…
?这些只是占位符。您需要在那里指定实际的列名。或者,如果您为所有列提供值,则可以完全忽略它。它实际上有实际的列,我只是在其中加了省略号,这样它将更短,更易于阅读。我怀疑列类型不全是varchar
,看到有像CallNo
或Copies
这样的输入,但你却对所有的输入都使用了撇号。我不是.NET用户,但如果有异常,你应该尝试捕捉异常。这将比那些试图在黑暗中拍摄照片的人提供更多信息。@TimBiegeleisen文本
可能来自.Net
GUI,而不是数据库表。因此,我调用了数据类型varchar
,因为我指的是数据库(不是string
)。在这种情况下,OP可以使用字符串
(.Text
),因为它将用作查询字符串,而不是在.Net
程序中用作数值计算。