2017-07-24 133 views
0

我想從一個sql數據庫表中加載數據到datagridview。SqlDataAdapter.Fill無效的對象名稱SQL

我得到如下:

類型「System.Data.SqlClient.SqlException」未處理的異常出現在system.data.dll其他信息:無效的對象名稱JournalItems「。

時調用此:

SqlDataAdapter.Fill(<dataset here>, <datatable name here>) 

我知道JournalItems是在我的數據庫中的數據表有效。我也嘗試使用「MyInitialCatalog.dbo.JournalItems」和「MyInitialCatalog.JournalItems」,但沒有成功。

這裏是我的代碼:

private void loadData_Click(object sender, EventArgs e) 
    { 
     string connectionString = "Data Source=myDataSource;Initial Catalog=MyInitialCatalog;Persist Security Info=True;User ID=myID;Password=myPassword"; 
     string sql = "SELECT * FROM JournalItems"; 
     SqlConnection connection = new SqlConnection(connectionString); 
     connection.Open(); 
     sCommand = new SqlCommand(sql, connection); 
     sAdapter = new SqlDataAdapter(sCommand); 
     sBuilder = new SqlCommandBuilder(sAdapter); 
     sDs = new DataSet(); 
     JournalItems = new DataTable(); 
     sAdapter.Fill(sDs, "JournalItems"); 
     sTable = sDs.Tables["JournalItems"]; 
     connection.Close(); 
     journalItemsDataGridView.DataSource = sDs.Tables["JournalItems"]; 
     journalItemsDataGridView.ReadOnly = true; 
     saveData.Enabled = false; 
     journalItemsDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 
    } 

PS:這裏是我試圖按照教程: http://csharp.net-informations.com/datagridview/csharp-datagridview-database-operations.htm

+0

您可以將JournalItems命名爲您的DataTable:JournalItems = new DataTable(「JournalItems」); –

+0

您是否檢查過在打開()之後連接狀態是否打開?也可以試試sAdapter.Fill(sDs); –

+0

嘿,我沒有檢查連接的狀態,它是開放的。當使用sAdapter.Fill(sDs)時,它仍然給我完全相同的錯誤; –

回答

0

PS這裏是我試圖按照教程:http://csharp.net-informations.com/datagridview/csharp-datagridview-database-operations.htm

這裏是教程設置你應該如下:

https://msdn.microsoft.com/en-us/library/fxsa23t6.aspx

以「創建簡單數據應用程序」開頭

爲什麼我會在網上找到其他人呢?原因不是詳盡的清單:

  • 您所使用的編程語言的創造者,創造了他們的最佳實踐模型與數據集時
  • 他們適當的抽象(隱藏)很多周圍的細節數據庫之間的交互,除非你需要得到那麼低的和骯髒的
  • 它會清理你的代碼沒有結束
  • 他們是安全,快速和高度功能;你會自動避開大規模的安全問題,不需要SQL注入
  • 它們是你現在正在做的事情的進步;您不需要手動編寫窗體,編寫用於放置和設置每個組件的屬性的語句:您使用可提供豐富和專業編輯體驗並生成高質量代碼的可視化設計器。這是沒有什麼不同

如果你在船上,微軟建議你做你的數據訪問的方式,你的代碼看起來會有點像這樣:

MyTypedDataSet ds = new MyTypedDataSet(); 
MyTypedTableAdapter ta = new MyTypedTableAdapter(); 
ta.Fill(ds, "my where clause parameter value"); 
myGridview.DataSource = ds.MyTypedTable; 

或者,微創:

myGridview.DataSource = new MyTypedTableAdapter().GetXXX(); 

沒有連接字符串,沒有按鈕點擊處理程序充滿了狡猾的SQL;可重複使用,可維護,易於閱讀的代碼,不需要100行來推動數據庫連接的極小點

+0

太棒了!在13行代碼中,我取代了235,我的程序也做了同樣的事情。作爲一個沒有經驗的年輕開發人員,我很驚訝這是多麼的無縫。 –

0

DataSet中沒有表稱爲 "JournalItems"

而不是

JournalItems = new DataTable(); 

創建表的數據集內:

sDs.Tables.Add("JournalItems"); 

哦,原來我的最初的回答是錯誤的。如果數據集沒有指定名稱的表,那麼dataAdapter應該創建它。

您需要確保連接到正確的數據庫和正確的模式。嘗試在查詢本身加入數據庫名稱和架構名稱:

SELECT * FROM DataBaseName.SchemaName.JournalItems 

我原來的答覆的其餘部分仍然是正確的 - 只是現在,我已經訪問過的鏈接您正在使用的教程中,我需要添加您應該避免使用類級變量來保存實現接口的實例 - 因爲那樣您就不能使用using語句,並且最終可能不會處理應該處理的實例。

SqlConnectionSqlCommandSqlDataAdapterSqlCommandBuilder全部實現了IDisposable接口,讓你真正應該使用他們using語句中。順便說一句,你不需要SqlCommandBuilder這個代碼。
您的代碼應該看起來更像是這樣的:

string connectionString = "Data Source=myDataSource;Initial Catalog=MyInitialCatalog;Persist Security Info=True;User ID=myID;Password=myPassword"; 
string sql = "SELECT * FROM JournalItems"; 
sDs = new DataSet(); 
sDs.Tables.Add("JournalItems"); 

using(var connection = new SqlConnection(connectionString)) 
{ 
    using(var sCommand = new SqlCommand(sql, connection)) 
    { 
     using(var sAdapter = new SqlDataAdapter(sCommand)) 
     { 
      sAdapter.Fill(sDs, "JournalItems"); 
     } 
    } 
} 
journalItemsDataGridView.DataSource = sDs.Tables["JournalItems"]; 
journalItemsDataGridView.ReadOnly = true; 
saveData.Enabled = false; 
journalItemsDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 
+0

To澄清:我不是試圖向名爲JournalItems的sD添加一個表。 sql數據庫有一個名爲JournalItems的表,我試圖用它填充數據集sDs。這仍然給我和以前一樣的錯誤。 –

+0

感謝您的更新@Zohar Peled。我曾嘗試使用「DataBaseName.SchemaName.JournalItems」指定表,如我在原始問題中所述,如下所示:「MyInitialCatalog.dbo.JournalItems」。我的SchemaName可能是錯誤的,因爲我只是假設它的dbo。 –