2017-05-05 59 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只是近似值。

這是一個相當長的答案,我的老化眼睛可能有一個或兩個語法錯誤。請原諒我,讓我知道任何錯誤或建議,我會很樂意爲您更新。