使用一个查询插入两个表

时间:2017-05-05 03:30:45

标签: c# mysql

我的代码出了什么问题,我试图将两个查询合并为一个。但第二个查询无法正常工作,我已经按照此链接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);

1 个答案:

答案 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只是近似值。

这是一个相当长的答案,我老化的眼睛可能会有一两个语法错误。请原谅我并告诉我任何错误或建议,我很乐意为您更新。