2016-08-15 202 views
0

我想從數據庫中使用ExecuteScalar()返回一個整數。但是,當我在數據庫本身上運行查詢時,我得到了正確的答案,並且c#始終給我一個0(空)。我知道它返回一個空,因爲在我添加id = Convert.ToInt32(command.ExecuteScalar());之前它會給我一個錯誤,告訴我確保處理NULL。我期待它返回3 btw。ExecuteScalar()總是返回NULL

private int getFamilyId() 
{ 
    int id = 0; 
    using (SqlConnection connection = new SqlConnection(Globaldata.ConnectionString)) 
    { 
     using (SqlCommand command = new SqlCommand()) 
     { 
      string sqlString = @"SELECT [Id] FROM [dbo].[FamilyDetails];"; 
      command.Connection = connection; 
      command.CommandText = sqlString; 
      try 
      { 
       connection.Open(); 
       id = Convert.ToInt32(command.ExecuteScalar()); 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK); 
      } 
      finally 
      { 
       connection.Close(); 
      } 
      return id; 
     } 
    } 
} 

This is what I get when I run it on the database

+1

檢查連接字符串。它是否指向你正在執行查詢的同一個數據庫? – user3185569

+0

如果刪除,該怎麼辦?在查詢文本中? –

+0

是的,它是正確的數據庫,因爲我從數據庫 - >屬性 - >連接字符串複製了連接字符串。 –

回答

0

當你這樣做:

string sqlString = @"SELECT [Id] FROM [dbo].[FamilyDetails];"; 

你不想這樣做:

id = Convert.ToInt32(command.ExecuteScalar()); 

三件事情可以去錯在這裏。

  • 問題1: 如果有表中沒有行,command.ExecuteScalar()西港島線返回

  • 問題2: 如果表中有任何行,command.ExecuteScalar()將返回碰到的第一行的值,因爲SELECT語句不限於1值。

  • 問題#3: 如果Id列未聲明爲NOT NULL command.ExecuteScalar()可以返回一個的DBNull,當轉換爲一個整數,它是沒有意義的。

試試看當表中有0或1或2條記錄時會發生什麼。

+0

您如何改變這段代碼? –

+0

如果沒有create table語句以及爲什麼需要該ID的值,則無法回答您的問題。 底線是ExecuteScalar只返回一個值,而SELECT語句可以根本不返回任何值,甚至可以返回一長串值。 – sunnyhighway

0

--UPDATE--

它現在,我的連接字符串有一個字符缺失。我想這是在我拿出連接字符串的連接超時部分時發生的。

謝謝您的建議!

+3

什麼是你的連接字符串之前和之後修復。請提及它們。 –

+0

這只是一個錯字,我不小心從真正的 刪除了原始連接:'Data Source =(LocalDB)\ MSSQLLocalDB; AttachDbFilename = D:\ Users \ RecordDatabaseFile.mdf; Integrated Security = Tru; Connect Timeout = 10' 將其更改爲:'Data Source =(LocalDB)\ MSSQLLocalDB; AttachDbFilename = D:\ Users \ RecordDatabaseFile.mdf; Integrated Security = True; Connect Timeout = 10' –