Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何高效地查询数据库,必要时添加行,并获得结果_C#_.net_Sql Server Ce - Fatal编程技术网

C# 如何高效地查询数据库,必要时添加行,并获得结果

C# 如何高效地查询数据库,必要时添加行,并获得结果,c#,.net,sql-server-ce,C#,.net,Sql Server Ce,我在我的C#项目中使用SQL Server Compact。我的数据库有一个Users表,它有两列—ID列(主键)和Username列。我通过在users表中插入用户名来跟踪与我的系统交互的各种用户 当用户联系系统时,如果他们不在,我想在表中记录他们的名字。显然,我可以将UNIQUE关键字添加到Username列,但这意味着我需要处理重复输入尝试的异常。一旦名称出现在表中(因为它已经存在或者我必须添加它),我需要获得相应的ID 这里有一些可以使用的代码 public void GetUserId

我在我的C#项目中使用SQL Server Compact。我的数据库有一个Users表,它有两列—ID列(主键)和Username列。我通过在users表中插入用户名来跟踪与我的系统交互的各种用户

当用户联系系统时,如果他们不在,我想在表中记录他们的名字。显然,我可以将UNIQUE关键字添加到Username列,但这意味着我需要处理重复输入尝试的异常。一旦名称出现在表中(因为它已经存在或者我必须添加它),我需要获得相应的ID

这里有一些可以使用的代码

public void GetUserId(string username)
{
    using (SqlCeCommand selcmd= new SqlCeCommand(
        "SELECT * FROM users WHERE username = @user", conn))
    {
        selcmd.Parameters.AddWithValue("@user", username);
        SqlCeResultSet rs = selcmd.ExecuteResultSet(ResultSetOptions.Scrollable);
        if (!rs.HasRows)
        {
            using (SqlCeCommand inscmd= new SqlCeCommand(
                "INSERT INTO users (username) values (@user)", conn))
            {
                inscmd.Parameters.AddWithValue("@user", username);
                inscmd.ExecuteNonQuery();
            }

            rs = selcmd.ExecuteResultSet(ResultSetOptions.Scrollable);
        }

        rs.ReadFirst();

        return (rs.GetInt32(rs.GetOrdinal("id")));
    }
}
有什么方法可以更有效地执行此操作吗?

您可以执行以下操作:

INSERT IF NOT EXISTS INTO `tablename` yadda yadda yadda
这不会引起例外


这是一个SQL问题,不是c#或.net问题,顺便说一句

您的解决方案是SQL Server Compact的最佳方法-其他建议的解决方案使用SQL Server Compact中不可用的语法

好吧,这肯定应该放在存储过程中。然后,无论你做什么,只需一次访问数据库。同意。唯一的问题是SQL Server Compact不支持存储过程。是的。。在互联网上用于许多商品。您的解决方案是SQL Server Compact的最佳方法谢谢@ErikEJ。如果您要发布一个快速答案,我将接受。SQL Server Compact似乎不支持“如果不存在则插入…”语法。然后查看您的问题上的注释=p但您可以做的另一件事是选择查找名称,如果没有返回行,则插入我理解,但使用其他数据库解决方案不是一个选项。关键是,我有一个有效的解决方案,但我不相信这是最有效的解决方案。这就是我要找的。我马上就发布工作代码,以便进行potshots。