.net 尝试检查sql表中是否已存在值时出现问题,不要重复

x3naxklr  于 2022-12-30  发布在  .NET
关注(0)|答案(4)|浏览(243)

我现在正在学习更多关于C#和SQL连接的知识,并且正在做一个挑战,我正在做一个简单的atm。
这个自动取款机将处理创建帐户,检查它是否存在于数据库中,如果不存在,然后添加到数据库中,如果存在,然后关闭程序。它也将处理自动取款机的其余部分,一旦你登录到你的卡。与取出和输入。
这个挑战只是为了让我学习更多的SQL和C#。
我的问题:我试图检查值是否已经存在于我的SQL表中,但我不确定我做错了什么。
先谢了!

bool checkifExist(int number) {
        bool itExist;
        string queryString;
        var cnn = new SqlConnection(connectionString);
        DataTable dt = new DataTable();
        try
        {
            cnn.Open();

            queryString = "select Count(*) from dbo.User_Card_Information where [CardNumbers] = @cardnumbers";
            SqlCommand check_cardnumber = new SqlCommand(queryString, cnn);
            check_cardnumber.Parameters.AddWithValue("@cardnumbers", cardnumber);
            int cardExist = (int)check_cardnumber.ExecuteScalar(); 
            if(check_cardnumber.ExecuteNonQuery() != cardnumber)
            {
             
                Console.WriteLine("Create completed!");
                cnn.Close();
                return itExist = false;

            }
            else
            {
                Console.WriteLine("This Card Number already exist!");
                itExist = true;
                cnn.Close();
                return itExist;

            }
        }
        catch (System.Data.SqlClient.SqlException ex)
        {
            string msg = "Fetch Error:";
            msg += ex.Message;
            throw new Exception(msg);
        }
        finally
        {
            cnn.Close();
        }
    }
nhaq1z21

nhaq1z211#

如果要避免数据库中出现重复,可以在列上设置约束。约束UNIQUE确保该列的值只存在一次。
关于constraints的更多信息
在您的代码中,两次执行相同的查询是没有意义的:

queryString = "select Count(*) from dbo.User_Card_Information where 
            [CardNumbers] = @cardnumbers";
            SqlCommand check_cardnumber = new SqlCommand(queryString, cnn);
            check_cardnumber.Parameters.AddWithValue("@cardnumbers", 
            cardnumber);
        >   int cardExist = (int) check_cardnumber.ExecuteScalar();
        >   if(check_cardnumber.ExecuteNonQuery() != cardnumber)
            {
             
                Console.WriteLine("Create completed!");
                cnn.Close();
                return itExist = false;

            }

此外,您使用的SqlCommand.ExecuteNonQuery()返回受影响的行,这不是您想要的。
您应该将(int)check_cardnumber.ExecuteScalar()的结果与给定的card_number进行比较。

sqxo8psd

sqxo8psd2#

如果目的是检查数据是否存在于表中,则可以只查询顶行而不是所有行,在这种情况下,不会出现多行或重复行的异常。

w8rqjzmb

w8rqjzmb3#

嗨我想你需要这样的东西

object result = cmd.ExecuteScalar(); // ExecuteScalar fails on null
        if (result.GetType() != typeof(DBNull))
        {
            test = (int?)result;
        }
irlmq6kh

irlmq6kh4#

public static void InsertRecord()
            {
                SqlConnection connection= new SqlConnection(CONNECTION_STRING);
                try
                {
                    connection.Open();
                    int x;
                    Console.WriteLine("Enter username:");
                    string user = Console.ReadLine();
                    string query = "insert into userTable values (@val)";
                    using(SqlCommand command = new SqlCommand(query, connection))
                    {
                        command.Parameters.AddWithValue("@val", user);
                        x=command.ExecuteNonQuery();
                    }
                    if(x==0)
                    {
                        Console.WriteLine("user already exists in Database.");
                    }
                    Console.WriteLine("user inserted successfully.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally 
                {
                    connection.Close();
                }

            }

相关问题