【问题标题】:ExecuteScalar() always return NULLExecuteScalar() 总是返回 NULL
【发布时间】:2016-08-16 03:31:33
【问题描述】:

我正在尝试使用 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;
        }
    }
}

【问题讨论】:

  • 检查连接字符串。它是否指向您正在执行查询的同一数据库?
  • 如果你删除了怎么办?在查询文本中?
  • 是的,它是正确的数据库,因为我从 database->properties->connectionstring 复制了连接字符串。
  • @AlbinVinoy 调试显示的代码并检查对象connection 并检查ConnectionString 属性。
  • 在进入try 块之前使用此行command.CommandType = CommandType.Text;

标签: c# winforms tsql executescalar


【解决方案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 命令。ExecuteScalar() 可能返回 DbNull,这在转换为整数时没有任何意义。

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

【讨论】:

  • 你如何建议我更改那行代码?
  • 如果没有 create table 语句以及为什么需要 ID 的值,就无法回答您的问题。底线是 ExecuteScalar 只返回一个值,而 SELECT 语句可以不返回任何值,甚至可以返回一长串值。
【解决方案2】:

--更新--

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

感谢您的建议!!!

【讨论】:

  • 修复之前和之后的连接字符串是什么。请同时提及。
  • 这只是一个错字,我不小心删除了真正原始连接中的 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
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 2016-11-02
  • 2014-05-06
相关资源
最近更新 更多