2017-05-05 61 views
0

我的代码有什么问题,我试图将两个查询合并为一个。但第二个查询不起作用,我已经按照这个链接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); 

表的定义:用于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); 
+0

你真的在你的INSERT语句中有省略号吗?那些只是占位符。您需要在那里指定实际的列名称。或者,如果您为所有列提供值,则可以完全忽略它。 –

+0

它实际上有实际的专栏,我只是把省略号,所以它会更短,并易于阅读 –

+1

我怀疑列类型不是所有'varchar',看到有输入像'CallNo'或'副本',但你使用对所有人而言。 – Ian

回答

0

船长Teemo问我是否能够使用参数重写。

这是一个比较简单的操作;但是,我为SQL Server编写代码,并且可能与MySql命令有细微的差异,我没有使用数据层的方法(是这个Cold Fusion?),所以我只是将它写在ADO中。

在这种情况下我简单地更换所有的值与SQL变量的VALUES子句中,基本上重复使用与前面的@的列名,所以列fBookTitle被分配值@fBookTitle。然后我们可以通过Parameters.AddWithValue()方法将这些参数分配给command对象。对于以上@fBookTitle值的调用将是cmd.Parameters.AddWithValue("@Title", txtTITLE.Text);我注意到,在第二个查询中使用的变量都在第一个查询中,但反之亦然;所以我将首先建立执行Qry2,然后我们可以简单地更改CommandText并添加其他参数。 使用参数的事情之一是,您将需要添加具有正确类型的值,因此需要在数据库中添加一个BigInt值,作为对应的C#类型的Int64。

我可以做的是展示如何通过ADO与SQL Server完成这项工作,并且您可以修改需要完成的工作。如果您找不到可以使用参数的cfgotcall,那么您可以将其更改为与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(); 
} 

山本哲哉表明,这种被转换到一个Stored Procedure

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

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