2016-08-15 260 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' –