2017-05-05 2 views
0

Was ist falsch mit meinem Code, ich habe versucht, zwei Abfrage in eine zu kombinieren. Aber die zweite Abfrage funktioniert nicht, ich folge bereits der Antwort dieses Links INSERT INTO two tables at one query, aber ich denke, dass meiner nicht funktioniert, fehlt mir etwas in meinem Code?Einfügen in zwei Tabellen mit einer Abfrage

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); 

Tabelle Definition: für tbladdbook

fBookTitle varchar 
fAuthor  varchar 
fEdition  varchar 
fBookYr  varchar 
fPublication varchar 
fAccNo  varchar 
fCallNo  varchar 
fCategory varchar 
fBarCodeNo varchar 
fCurrentCopies float 

Tabelle Definition: für tbltrue

fBookTitle varchar 
fAuthor  varchar 
fBarCodeNo bigint 
fTrueCopies bigint 

Alt und Arbeitscode:

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

Haben Sie wirklich Ellipsen '...' in Ihren 'INSERT' Anweisungen? Das sind nur Platzhalter. Sie müssen dort die tatsächlichen Spaltennamen angeben. Oder Sie können das vollständig weglassen, wenn Sie Werte für alle Spalten angeben. –

+0

Es hat tatsächlich Spalte, ich habe nur Auslassungspunkte, so dass es kürzer und leicht zu lesen sein wird –

+1

Ich vermute, dass der Spaltentyp nicht alle 'varchar' ist, da gibt es Eingabe wie' CallNo' oder 'Copies' und doch Sie verwenden ein Postweg für alle. – Ian

Antwort

0

Captain Teemo gefragt, ob ich mit Parametern neu schreiben konnte.

Dies ist eine relativ einfache Operation; Allerdings schreibe ich für SQL Server und es kann geringfügige Unterschiede mit den MySql-Befehlen und ich nicht die cfgotcall Methoden (ist diese Cold Fusion?), die für die Datenschicht verwendet werden, so werde ich nur dies in ADO schreiben .

In diesem Fall habe ich einfach alle Werte in der VALUES Klausel mit SQL-Variablen ersetzt, und im Grunde die Spaltennamen mit einem vorangestellten @ wieder verwendet, so dass die Spalte fBookTitle@fBookTitle den Wert zugewiesen wird. Dann können wir diese Parameter dem Objekt command über die Methode Parameters.AddWithValue() zuweisen. Für den oben genannten @fBookTitle Wert wäre der Aufruf cmd.Parameters.AddWithValue("@Title", txtTITLE.Text); Ich bemerkte, dass die Variablen in der zweiten Abfrage alle in der ersten Abfrage verwendet wurden, aber nicht umgekehrt; also werde ich zunächst execute Qry2 aufbauen, dann können wir einfach die CommandText ändern und die zusätzlichen Parameter hinzufügen. Eines der Dinge bei der Verwendung von Parametern ist, dass Sie die Werte mit dem richtigen Typ hinzufügen müssen. Daher muss ein Wert, der ein BigInt in der Datenbank ist, als der entsprechende C# -Typ von Int64 hinzugefügt werden.

Was ich tun kann, ist zu zeigen, wie dies über ADO mit SQL Server getan werden würde, und Sie können ändern, was getan werden muss. Wenn Sie keine cfgotcall finden, die mit Parametern arbeitet, können Sie dies nur für die Verwendung mit MySql ändern, die fast identische Syntax wie die SQL Server-Syntax hat.

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 schlägt vor, dass diese über zu einem Stored Procedure

Diese auf SQL Server eine einfache genug Aufgabe ist es konvertiert werden, aber ich weiß nicht, die MySQL-Implementierung ; Entschuldigung, dass Sie bekommen, was ich in Query Analyzer oder SSMS eingeben würde, und dies würde höchstwahrscheinlich auch für MySql übersetzt werden.

Die Syntax für dieses Verfahren wird ziemlich einfach sein, da wir nur die 2 Abfragen darin einfügen werden.

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 

Sobald wir die Stored Procedure erstellt, müssten wir den ursprünglichen Code ändern, die 2 INSERT-Abfragen zu entfernen und ersetzen sie durch einen Befehl, um die Prozedur aufrufen. Wir würden auch den Befehlstyp ändern, um anzuzeigen, dass wir eine Prozedur anstelle eines Textbefehls ausführen.

// 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(); 
} 

Meine Kommentare

auf den tatsächlichen Aussagen der Suche und der Code dies erscheint Bücher in einer Bibliothek von Art zu addieren. Es gibt eine Tabelle der Bücher (tbladdbook) und ein anderes für Buchkopien (tbltruecopies), und das einzige, was anders zwischen den beiden Tabellen ist, dass Kopien würden widerspiegeln, wie viele Kopien sind zur Zeit auf der Hand, aber die Graf ist von verschiedenen Arten; ein Wesen Float und das andere als BigInt. Meine Meinung wäre, dass diese beiden vom selben Typ sein sollten, und ich glaube wirklich nicht, dass es realistisch ist, dass diese Werte jemals die Kapazität einer 32-Bit-Ganzzahl übersteigen würden, wenn nicht 16 Bit. Nicht zu erwähnen, dass Float und Double nur Annäherungen sind.

Dies ist eine ziemlich lange Antwort, und meine alternden Augen können einen Syntaxfehler oder zwei haben. Bitte verzeihen Sie mir und lassen Sie mich von Fehlern oder Anregungen wissen, ich werde es gerne für Sie aktualisieren.

Verwandte Themen