Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用一个查询插入到两个表中_C#_Mysql - Fatal编程技术网

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”)我注意到第二个查询中使用的变量都在第一个查询中,但不是相反;因此,我将首先构建execute
Qry2
,然后我们可以简单地更改
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
程序中用作数值计算。