2013-01-07 22 views
-1

我創建了與Microsoft SQL數據庫的連接,並試圖在練習中添加基本信息,但出現以下錯誤。未將對象引用設置爲將數據插入數據庫的對象實例

Object reference not set to an instance of an object

這是我如何連接到數據庫

SqlConnection sqlConn; 
protected void butConnect_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string connectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=lrmg;Integrated Security=True;"; 
     sqlConn = new SqlConnection(connectionString); 
     sqlConn.Open(); 
     labMessage.Text = "a connection to your database was established"; 
    } 
    catch (SqlException sqlE) 
    { 
     labMessage.Text = sqlE.Message; 
    } 
    catch (Exception exe) 
    { 
     labMessage.Text = exe.Message; 
    } 

這裏是我的錯誤

protected void butSubmit_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string name = txtName.Text; 
     string date = txtDate.Text; 

     **SqlCommand cmd = sqlConn.CreateCommand();** 

     cmd.CommandText = "INSERT INTO Canditate(Name, Doj) VALUES('" + name + "'," + date + ")"; 
     cmd.ExecuteNonQuery(); 
     labMessage.Text = "The value was inserted into your database"; 
    } 
    catch (SqlException sqlE) 
    { 
     labMessage.Text = sqlE.Message; 
    } 
    catch (Exception exe) 
    { 
     labMessage.Text = exe.Message; 
    } 
} 

我的印象是SQL連接被打開,以便下爲什麼是異常?

+1

你試過了什麼?沒有將對象引用設置爲對象的實例意味着「NULL」使用調試器! – Nahum

+0

+1。是。如果這是一個優先級,那麼學習編程 - 並使用調試器來發現這一點非常重要。打破異常,看看什麼變量LS空。用你的大腦(是的,你有)找出原因。併爲你的SQL使用參數。 – TomTom

+0

檢查您的連接字符串,創建sqlconnection對象並逐步查看它是否正確初始化。 – nik0lias

回答

1

您應該有一個專用的方法來打開連接,每次使用連接時都要調用該方法。使用你當前的設置,butConnect_click必須在同一個請求中調用butSumbit_Click。因此,在butSubmit中添加對butConnect的調用。

3

你所得到的錯誤,因爲引用變量sqlConn爲空 - 正在發生可能是因爲

  • 從你的代碼片段,結果收到了創建的連接和 連接按鈕點擊打開。所以你需要在提交前點擊連接
  • 最可能的原因可能是不同的,假設這個ASP.NET代碼 - 在這種情況下,每個請求都由不同的頁面實例提供服務 - 所以如果你打開一個請求連接(connect點擊),它(該變量)將在下一個請求中不可用(提交點擊)。補救措施很簡單 - 在您需要時即創建並打開連接,即提交點擊。另一方面,您可能需要了解有關Web編程模型的模式以避免此類錯誤。
2

您使用兩個不同的事件來處理數據庫。爲什麼?你有沒有聽說過連接池?
大概在第一個事件(開放連接)和第二個事件(db插入)之間發生了一些事情,並將您的全局變量SqlConn更改爲null,您會收到錯誤消息。 (當然,我假設你在嘗試插入任何東西之前按下該按鈕打開連接)

使用connection pooling這種編程模式不再需要,相反,當您需要更新/插入/刪除/選擇你打開連接,做你的工作,並立即關閉連接,而不必保持開放,並消耗服務器和客戶端的資源。

try 
{ 
    string connectionString = "Data Source=.\\SQLEXPRESS;" + 
           "Initial Catalog=lrmg;Integrated Security=True;"; 
    using(SqlConnection sqlConn = new SqlConnection(connstring)) 
    { 
     SqlCommand cmd = sqlConn.CreateCommand();** 
     cmd.CommandText = "INSERT INTO Canditate(Name, Doj) VALUES(@name, @dt)"; 
     cmd.Parameters.AddWithValue("@name", txtName.Text); 
     cmd.Parameters.AddWithValue("@dt", Convert.ToDateTime(txtDate.Text)); 
     cmd.ExecuteNonQuery(); 
     labMessage.Text = "The value was inserted into your database"; 
    } 
} 
catch (SqlException sqlE) 
{ 
    labMessage.Text = sqlE.Message; 

} 
catch (Exception exe) 
{ 
    labMessage.Text = exe.Message; 
} 

還要注意的是,因爲你使用字符串連接來建立你的SQL文本你的代碼是受Sql Injection攻擊。這是一個不良的做法,應該不惜一切代價避免

相關問題