【问题标题】:sql command returning boolean for processing in C#sql 命令返回布尔值以在 C# 中进行处理
【发布时间】:2018-02-20 11:55:15
【问题描述】:

是否可以从 sql 命令返回布尔值 - 然后在 C# 中使用它?

我目前有一个数据库,我在其中插入条目。我想在插入之前知道该条目是否存在,如果存在则做一些事情......

private void create_user_Click(object sender, EventArgs e)
{
    int exist;
    using (DbConnection connection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\toilet\source\repos\WindowsFormsApp2\WindowsFormsApp1\Database1.mdf;Integrated Security=True"))
    {
        connection.Open();
        using (DbCommand command = new SqlCommand("WHERE EXIST (SELECT id FROM [information] WHERE id == @given_id)"))
        {
            command.Parameters.Add(new SqlParameter("@given_id", create_user_username_textbox.Text));
            command.Connection = connection;
            exist = command.ExecuteNonQuery();
        }
        MessageBox.Show(Convert.ToString(exist));
    }

    //login_screen login = new login_screen();
    //this.Hide();
    //login.ShowDialog();
    //this.Close();

}

这样做会在SqlCommand 中的WHERE 附近出现语法错误

【问题讨论】:

  • 是的,但是这里没有有效的 SQL 命令,只是查询的一部分。
  • X-Y ...您是否要进行“upsert”? (如果存在则更新,否则插入)
  • @Liam OP 似乎对 SQL 不太熟悉。
  • 将您的查询更改为SELECT 1 FROM [information] WHERE id = @given_id。检查它是否返回 1。如果不是,则为 false。
  • 为什么你想返回一个布尔值?如果查询返回单个 ID,则您已经知道存在现有记录。您可能不需要甚至需要向服务器返回任何内容 - 您可以编写适当的 MERGE 或 UPDATE 或 INSERT 语句

标签: c# sql database ado.net sqlcommand


【解决方案1】:

尝试使用有效的sql 语句并使用ExecuteScalar 获取某个值以比较它是否存在。示例:

 using (DbCommand command = new SqlCommand("SELECT 1 FROM [information] WHERE id = @given_id"))
 {
     command.Parameters.Add(new SqlParameter("@given_id", create_user_username_textbox.Text));
     command.Connection = connection;

     // get the result from the sql statement 
     var result = command.ExecuteScalar();

     // if the result is not null, convert it to an integer and compare it. Otherwise it is false (no records).
     exists = result != null ? (int) result > 0 : false;

 }

【讨论】:

  • 1. SQL Server 不支持==。 2. 在这种情况下,它可能没问题,但是选择 count(*) 只是为了确定表中是否存在单个记录,如果 where 子句可能返回多个记录(但话又说回来,也是我在 cmets 中的建议)。
  • 是的@ZoharPeled,感谢您的反馈。我已经对其进行了一些调整。
【解决方案2】:

使用以下查询检查可用性。

IF EXIST (SELECT id FROM [information] WHERE id = @given_id) 
SELECT CAST(1 AS BIT)
ELSE 
SELECT CAST(0 AS BIT)

【讨论】:

  • 不需要返回这样的东西。结果存在意味着是的,有记录。 1 也不是布尔值。
  • @panagiotis-kanavos,同意。刚刚修改了问题中使用的查询。
【解决方案3】:

随便用

SELECT id FROM [information] WHERE id == @given_id

然后像这样调用SqlCommand

object o = cmd.ExecuteScalar();

你可以设置一个布尔值:

bool valueExists = o != null && o != DBNull.Value;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多