2016-11-15 16 views
0

我使用從DataTable填充的數據控件來在應用程序中顯示圖像。現在我需要修改它以顯示來自不同DataTable的兩個圖像列表。因此添加了第二個DataList併爲第二個DataTable編碼。添加第二個數據表控件後出錯

我收到錯誤:

The Connection String Property has not been initialized.

代碼數據表的控制,第二個(edt)生成錯誤:

DataTable dt = new DataTable(); 
using (Conn) 
{ 
    SqlDataAdapter ad = new SqlDataAdapter("SELECT QuestionID, Images2.ImageID, ImageFile, ImageContent, ImageName, SEQ_NUM from qimages join Images2 on qimages.imageid = images2.imageid where QuestionID = @QuestionID", Conn); 
    ad.SelectCommand.Parameters.Add("QuestionID", SqlDbType.BigInt).Value = Convert.ToInt32(Request["Id"]); 
    ad.Fill(dt); 
} 
dlImages.DataSource = dt; 
dlImages.DataBind(); 

DataTable edt = new DataTable(); 
using (Conn) 
{ 
    SqlDataAdapter ed = new SqlDataAdapter("SELECT QuestionID, Images2.ImageID, ImageFile, ImageContent, ImageName, SEQ_NUM from eimages join EditedImages on eimages.imageid = editedimages.imageid where QuestionID = @QuestionID", Conn); 
    ed.SelectCommand.Parameters.Add("QuestionID", SqlDbType.BigInt).Value = Convert.ToInt32(Request["Id"]); 
    ed.Fill(edt); 
} 
EditImages.DataSource = edt; 
EditImages.DataBind(); 

試圖改變所述第二控制使用其自己的連接串如建議。下面是第二個數據表中的新代碼,這仍然是拋出同樣未初始化錯誤:

string Constr = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString; 
      SqlConnection Conn2 = new SqlConnection(Constr); 
      DataTable edt = new DataTable(); 
      using (Conn2) 
      { 
       SqlDataAdapter ed = new SqlDataAdapter("SELECT QuestionID, EditImages.ImageID, ImageFile, ImageContent, ImageName, SEQ_NUM from eimages join EditImages on eimages.imageid = editimages.imageid where QuestionID = @QuestionID", Conn); 
       ed.SelectCommand.Parameters.Add("QuestionID", SqlDbType.BigInt).Value = Convert.ToInt32(Request["Id"]); 
       ed.Fill(edt); 
      } 
      EditImages.DataSource = edt; 
      EditImages.DataBind(); 
+0

如果錯誤顯示連接字符串屬性尚未初始化,那麼顯示如何在您的問題中初始化連接字符串可能是個好主意。請仔細閱讀[MCVE](http://stackoverflow.com/help/mcve),因爲您的問題缺乏完整性原則。 – mason

回答

1

當你完成它的處理時,你正在處理連接(這就是使用塊的用途)。既可以在一個使用塊中執行所有數據庫交互,也可以使用相同的連接字符串創建另一個連接。以下是在同一個使用塊中執行此操作的示例。

DataTable dt = new DataTable(); 
DataTable edt = new DataTable(); 

using (Conn) 
{ 
    SqlDataAdapter ad = new SqlDataAdapter("SELECT QuestionID, Images2.ImageID, ImageFile, ImageContent, ImageName, SEQ_NUM from qimages join Images2 on qimages.imageid = images2.imageid where QuestionID = @QuestionID", Conn); 
    ad.SelectCommand.Parameters.Add("QuestionID", SqlDbType.BigInt).Value = Convert.ToInt32(Request["Id"]); 
    ad.Fill(dt); 
    SqlDataAdapter ed = new SqlDataAdapter("SELECT QuestionID, Images2.ImageID, ImageFile, ImageContent, ImageName, SEQ_NUM from eimages join EditedImages on eimages.imageid = editedimages.imageid where QuestionID = @QuestionID", Conn); 
    ed.SelectCommand.Parameters.Add("QuestionID", SqlDbType.BigInt).Value = Convert.ToInt32(Request["Id"]); 
    ed.Fill(edt); 
} 

dlImages.DataSource = dt; 
dlImages.DataBind(); 
EditImages.DataSource = edt; 
EditImages.DataBind(); 

你有很多重複的代碼在這裏,你可能會認爲重構它變成一個方法。您還將數據庫訪問邏輯組合到您的Web窗體代碼後面,這非常混亂。你所有的數據庫邏輯都應該被抽象成一個單獨的數據訪問層。

+0

謝謝,這照顧到了這個問題。我知道我的代碼在這裏很不理想。當我嘗試設置並使用單獨的數據訪問層時,我似乎無法使其工作......所以不得不這樣做以便具有正常運行的應用程序。 –

+0

@BrentOliver設置數據訪問層非常簡單。創建一個新班級。添加與數據庫交談的函數,並通過該層執行所有數據訪問。避免使用數據表,通過強類型模型對象傳遞對象。我在這裏創建了一個[示例項目](https://github.com/mason-mcglothlin/FancyStoreDemo),它顯示了使用多個數據層,可以在應用程序中隨意更換。 – mason

+0

我在使用DAL時遇到的一個問題是使用視圖。爲了顯示我有意見的一些數據,並且無法讓他們使用類來工作。我確實從那開始,但是由於我不得不使用存儲過程和連接字符串,因此我可以使用這些實體。 –

0

當一個數據源嘗試綁定到數據的時候得到這個錯誤,但不能因爲找不到連接字符串。當你想在數據庫更改或檢索數據using(SqlConnection Conn = new SqlConnection("......"))

SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings[nameOfConnectionString].ConnectionString; 

更進一步,用這個。

保留一個連接對象的全局實例是一種不好的做法,因爲您可能會失去對該實例生命週期的控制權。

+0

我不明白爲什麼它會這樣做,因爲在添加第二個數據表控件(它使用相同的Conn連接字符串)之前,連接字符串「Conn」工作得很好。 –

+0

@BrentOliver,我更新了我的答案。 –

+0

我在這個頁面上使用了這個連接字符串數月。唯一的變化是我的問題中的第二個數據表控件。我知道連接字符串的工作原理,但由於某種原因,它不喜歡第二個數據表控件。在我打開第二個數據表之前,我必須做些什麼來「關閉」第一個數據表?我知道問題不在於連接字符串本身是無效的。 –

相關問題