2013-10-11 62 views
0

我想要的數據與此代碼插入到數據庫中ASP.NET:將數據插入數據庫,ASP.NET引發異常

string conn = "TJLDatabaseConnectionString"; 
conn = ConfigurationManager.ConnectionStrings["Conn"].ToString(); 
SqlConnection objsqlconn = new SqlConnection(conn); 
objsqlconn.Open(); 
SqlCommand objcmd = new SqlCommand("Insert into MeterReading(MachineName,LastReading,CurrentReading,Consumption) Values('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "')", objsqlconn); 
objcmd.ExecuteNonQuery(); 
//MessageBox.Show("Successful"); 

但是當我運行它。它提供了以下消息:

+5

你忘了告訴異常消息。 –

+0

'它給出以下消息'它是什麼? –

+4

**注意:您已經開放給SQL注入攻擊:*從未*將值組合成SQL語句和字符串連接。使用參數化查詢('objcmd.Paramters.Add(name,value)')。 – Richard

回答

0

由於沒有在你的問題的任何異常提這樣只是爲了更好的和可讀的代碼,我建議你使用的塊太大使用。它爲您提供了更好,更清晰,更易讀的代碼,並在超出範圍時處理對象。

這意味着在編碼,我們generlly遵循良好做法。請向我們展示合適解決方案的例外情況。

private void ConnectToDb() 
{ 

var conn = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString; 
using(var conn = new SqlConnection(conn)) 
{ 
conn.Open(); 
var cmdtxt ="Insert into MeterReading(MachineName,LastReading,CurrentReading,Consumption) 
Values(@P1,@P2,@P3,@P4)"; 
using(var cmd = new SqlCommand(cmdtxt, conn)) 
{ 
    cmd.CommandType=CommandType.Text; 
    cmd.Parameters.AddWithValue("@P1", TextBox1.Text); 
    cmd.Parameters.AddWithValue("@P2", TextBox2.Text); 
    cmd.Parameters.AddWithValue("@P3", TextBox3.Text); 
    cmd.Parameters.AddWithValue("@P4", TextBox4.Text); 
    cmd.ExecuteNonQuery(); 

} 
con.close(); 
} 
} 
+0

您值得讚賞,但您仍然無法解釋您的答案爲何解決OP問題。 – Steve

+0

@Steve,還是OP沒有提供實際的異常。所以我剛纔建議他去爲這樣的代碼可能是他的問題將得到修復.. –

+0

你使原來的OP代碼中的另一個重大改變,我敢打賭正是這種變化有更大的可能性來修復OP代碼。但你不解釋,這是我評論的意思。 – Steve

0

使用一個變量來檢查,如果行是越來越影響或不

rowAffected= objcmd.ExecuteNonQuery(); 
      if(rowAffected >0) 
       { 
       //sucessful 
       } 
      else 
       { 
       // 
       } 
2

首先重要的,一定要使用SQL參數以防止SQL注入。永遠不要將參數連接成一個sql查詢。這也可以解決本地化或「逃跑」的問題。

此外,使用using語句,以確保使用非託管資源,任何事情(如SQL連接)將甚至錯誤關閉並設置:

string sql = @" 
INSERT INTO MeterReading(MachineName,LastReading,CurrentReading,Consumption) 
VALUES(@MachineName,@LastReading,@CurrentReading,@Consumption)"; 

using(var objsqlconn = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString())) 
using (var cmd = new SqlCommand(sql, objsqlconn)) 
{ 
    cmd.Parameters.AddWithValue("@MachineName", TextBox1.Text); 
    cmd.Parameters.AddWithValue("@LastReading", TextBox2.Text); 
    cmd.Parameters.AddWithValue("@CurrentReading", TextBox3.Text); 
    cmd.Parameters.AddWithValue("@Consumption", TextBox4.Text); 
    objsqlconn.Open(); 
    int insertedCount = cmd.ExecuteNonQuery(); 
} 

側面說明:如果你有一個標識列並且要檢索新創建的主鍵,即使您使用INSERT INTO使用SCOPE_IDENTITYExecuteScalar

string sql = @" 
INSERT INTO MeterReading(MachineName,LastReading,CurrentReading,Consumption) 
VALUES(@MachineName,@LastReading,@CurrentReading,@Consumption); 
SELECT CAST(scope_identity() AS int)"; 

//... 
int newID = (int)cmd.ExecuteScalar();