我的代码出了什么问题,我试图将两个查询合并为一个。但第二个查询无法正常工作,我已经按照此链接INSERT INTO two tables at one query的答案,但我认为我的工作无效,我在代码中遗漏了什么?
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);
表定义:for tbladdbook
fBookTitle varchar
fAuthor varchar
fEdition varchar
fBookYr varchar
fPublication varchar
fAccNo varchar
fCallNo varchar
fCategory varchar
fBarCodeNo varchar
fCurrentCopies float
表定义:for 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);
答案 0 :(得分:0)
Teemo船长询问我是否能够使用参数重写。
这是一个相对简单的操作;但是,我为SQL Server编写,可能与MySql命令略有不同,我没有用于数据层的cfgotcall
方法(是这个Cold Fusion?) ,所以我将在ADO中写这个。
在这种情况下,我只是将VALUES
子句中的所有值替换为SQL变量,并且基本上将列名重用于前面的@,因此为fBookTitle
列赋值{{ 1}}。然后我们可以通过@fBookTitle
方法将这些参数分配给command
对象。对于上面的 @fBookTitle 值,调用将是Parameters.AddWithValue()
我注意到第二个查询中使用的变量都在第一个查询中,但反之亦然;所以我首先要建立执行cmd.Parameters.AddWithValue("@Title", txtTITLE.Text);
,然后我们可以简单地更改Qry2
并添加其他参数。
使用参数的一个原因是您需要添加具有正确类型的值,因此需要在数据库中添加一个BigInt值作为Int64的相应C#类型。
我能做的是展示如何通过CommandText
与SQL Server一起完成,并且您可以修改需要完成的工作。如果找不到可以使用参数的ADO
,那么您可以将其更改为与MySql一起使用,MySql的语法与SQL Server语法几乎相同。
cfgotcall
Tetsuya Yamamoto 建议将其转换为
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(); }
这在SQL Server上是一项非常简单的任务,但我不知道MySql实现;抱歉,您将获得我将在查询分析器或SSMS中输入的内容,这也很可能会为MySql进行翻译。
此过程的语法将非常简单,因为我们要做的就是将2个查询包装在其中。
Stored Procedure
一旦我们创建了存储过程,我们就需要修改原始代码,删除2个INSERT查询并用调用该过程的one命令替换它们。我们还会更改命令类型以反映我们正在运行过程而不是文本命令。
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
我的评论
查看实际的语句和代码,这似乎是将书籍添加到各种库中。有一个Books( tbladdbook )表和另一个Book Copies( tbltruecopies )表,这两个表之间唯一不同的是 Copies 会反映当前有多少副本,但 Count 的类型不同;一个是// 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();
}
,另一个是Float
。我认为这两个应该属于同一类型,我真的不认为这些值超过32位整数(如果不是16位)的容量是切合实际的。不要说Float和Double只是近似值。
这是一个相当长的答案,我老化的眼睛可能会有一两个语法错误。请原谅我并告诉我任何错误或建议,我很乐意为您更新。