ExecuteScalar()总是返回NULL。

3

我尝试使用ExecuteScalar()从数据库中返回一个整数。但是,当我在数据库本身上运行查询时,我得到了正确的答案,而c#始终给我返回0(空值)。我知道它返回了一个null,因为在添加id = Convert.ToInt32(command.ExecuteScalar());之前,它会给我一个错误,告诉我要确保处理NULL。我希望它能返回3。

 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
检查连接字符串。它是否指向你正在执行查询的同一数据库? - Zein Makki
如果在查询文本中删除分号,会发生什么? - Peter Bons
是的,这是正确的数据库,因为我从数据库->属性->连接字符串中复制了连接字符串。 - Albin Vinoy
我去掉了分号,结果是一样的。 - Albin Vinoy
4
调试您所看到的代码,并检查对象“connection”,并检查“ConnectionString”属性。 - Zein Makki
1
在进入 try 块之前使用这行代码 command.CommandType = CommandType.Text; - Raktim Biswas
2个回答

1

--更新--

现在它可以工作了,我的连接字符串少了一个字符。我想这是因为我从连接字符串中去掉了连接超时部分造成的。

感谢您的建议!!!


3
在修复之前和之后,你的连接字符串是什么?请提及它们。 - Raktim Biswas
这只是一个笔误,我不小心从True中删除了e。 原始连接: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 - Albin Vinoy

1
当你这样做时:

当你这样做时:

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

你不想这样做:

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

这里有三个可能出现问题的地方。

  • 问题 #1: 如果表中没有行,command.ExecuteScalar() 将会返回 Null

  • 问题 #2: 如果表中有任何行,command.ExecuteScalar() 将会返回第一行所包含的值,因为 SELECT 语句不限制只返回一个值。

  • 问题 #3: 如果 Id 列没有声明为 NOT NULL,command.ExecuteScalar() 可能会返回 DbNull,而将其转换为整数则毫无意义。

尝试在表中分别存在0、1和2条记录时会发生什么。


你认为我应该如何修改那行代码? - Albin Vinoy
没有创建表语句和为何需要 ID 值,无法回答您的问题。底线是 ExecuteScalar 返回仅一个值,而 SELECT 语句可以不返回任何值,甚至可以返回一个长列表的值。 - sunnyhighway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接