2017-02-07 2 views
-2

ich auf die Antwort geprüft siehe „How to get last inserted id?Der Wert der letzten eingefügten Zeile in SQL Server

Also hier weit ist das, was ich getan habe.

SqlCommand cmdInsert = new SqlCommand("INSERT INTO normal_asset(n_asset_serialNo,n_asset_propertyNo,n_asset_brandModel,n_asset_unitCost,n_asset_acquisitionDate,equitype_id,region_id) OUTPUT INSERTED.N_Asset_ID VALUES ('" + assetSerial + "','" + assetProperty + "','" + assetBrand + "','" + assetCost + "','" + assetAcquisition + "','" + assetEquipment + "','" + Session["usersRegion"].ToString() + "')"); 

cmdInsert.CommandType = System.Data.CommandType.Text; 
cmdInsert.Connection = conn; 

cmdInsert.ExecuteNonQuery(); 

Decimal newId = (Decimal)cmdInsert.ExecuteScalar(); 

SqlCommand cmdInsert2 = new SqlCommand("INSERT INTO asset(n_asset_id,office_id,asset_status,asset_accountable,asset_remarks) VALUES ('" + newId + "','" + inputOffice + "','" + inputStatus + "','" + inputAccountable + "','" + inputRemarks + "'"); 

cmdInsert2.CommandType = System.Data.CommandType.Text; 
cmdInsert2.Connection = conn; 

cmdInsert2.ExecuteNonQuery(); 

Dann möchte ich die entsprechende ID erhalten, die n_asset_id ist.

Das Problem ist die cmdInsert ist verdoppeln seinen Einsatz (vielleicht in meinem wenn Bedingung), aber ich kann nicht die Decimal newId = (Decimal)cmdInsert2.ExecuteScalar(); korrekt ausgeführt werden. Ich habe versucht, es zu Int zu machen. dann string -> in int konvertieren, aber immer noch kein Glück.

+1

Wie führst du 'cmdInsert2' aus, bevor du es definierst? Wenn das "cmdInsert" sein soll, dann "verdoppeln Sie seine Einfügung", weil Sie es zweimal ausführen. Auch was "if condition" meinen Sie? – David

+0

Wenn ich es direkt nach 'cmdInsert' ausführe, dann muss die angenommene Variable' should'/'muss' in der' newId' gespeichert werden. – Fiendcoder1

+0

Ich sehe, dass 'Dezimal newId = (Dezimal) cmdInsert2.ExecuteScalar(); 'steht 'cmdInsert2' Deklaration. Sie müssen die Zeile setzen * nach * deklarieren 'cmdInsert2' als' SqlCommand'. –

Antwort

3

Das Problem ist die cmdInsert seinen Einsatz

verdoppelt Das ist, weil Sie die SQL-Abfrage sind die Ausführung zweimal:

cmdInsert.ExecuteNonQuery(); 
Decimal newId = (Decimal)cmdInsert.ExecuteScalar(); 

Wenn Sie nur die letztere wollen, sollten Sie unterlassen die früher ganz:

Decimal newId = (Decimal)cmdInsert.ExecuteScalar(); 

Die Ausgabe sollte wahrscheinlich auch einesein, da wird die eingelegte Kennung ein int sein:

int newId = (int)cmdInsert.ExecuteScalar(); 

Als Nebenwirkung beachten Sie, dass Ihr Code zu weit offen ist, was „SQL-Injection-Angriffe“ genannt wird. Das heißt, versierte Benutzer können dazu führen, dass Ihr System beliebigen SQL-Code auf Ihrem Server ausführt. Diese Sicherheitslücke macht Ihren Code auch fragiler und schwieriger zu debuggen, da unerwartete Zeichen (nicht unbedingt böswillig, nur zufällig) in Ihrem SQL-Code Fehler verursachen können und Sie bis zur Laufzeit nicht einmal wissen, was Ihr SQL-Code ist .

Um dies zu beheben, untersuchen Sie die Parameter in Ihren Abfragen. Führen Sie niemals die Werte als Code aus, fügen Sie sie immer als Parameterwerte zu Ihren Befehlsobjekten hinzu.

+0

Ich werde das später überprüfen, guter Herr. – Fiendcoder1

+0

'int newId = (int) cmdInsert.ExecuteScalar();' dies wird die Ausnahme auslösen. Vielleicht so 'int newId = Convert.ToInt32 (cmdInsert.ExecuteScalar()); ' – Sergio

+0

Ich habe jedoch Ihren Rat befolgt. Sergios Korrektheit wird eine Ausnahme auslösen. – Fiendcoder1

Verwandte Themen