2

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

 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;
        }
    }
}

这是我在数据库上运行它时得到的

4

2 回答 2

1

- 更新 -

现在可以了,我的连接字符串缺少一个字符。我认为它发生在我取出连接字符串的连接超时部分时。

谢谢你的建议!!!

于 2016-08-15T19:05:54.867 回答
1

当你这样做时:

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

你不想这样做:

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

这里可能会出现三件事。

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

  • 问题 #2:如果表中有任何行,command.ExecuteScalar() 将返回它碰巧遇到的第一行的值,因为 SELECT 语句不限于 1 个值。

  • 问题 #3:如果 Id 列未声明为NOT NULL command.ExecuteScalar() 可能会返回DbNull,这在转换为整数时没有任何意义。

尝试看看当表中有 0 或 1 或 2 条记录时会发生什么。

于 2016-08-15T19:31:33.020 回答