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.
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. –
Es hat tatsächlich Spalte, ich habe nur Auslassungspunkte, so dass es kürzer und leicht zu lesen sein wird –
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