Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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#_Sql_.net_Database_Connection - Fatal编程技术网

C# 我想将两个文本框值与数据库中的两个对应列进行比较,如果条目是唯一的,则执行保存操作

C# 我想将两个文本框值与数据库中的两个对应列进行比较,如果条目是唯一的,则执行保存操作,c#,sql,.net,database,connection,C#,Sql,.net,Database,Connection,我有一个从文本框向数据库添加值的程序 我需要提供一种方法,如果增加的值不是唯一的,它应该返回一条错误消息。但我目前的代码无法做到这一点。即使该值不是唯一的,也会将数据保存在数据库中 下面是我的代码 try { if (runningExperimentToolStripMenuItem.Enabled == true && newExperimentToolStripMenuItem.Enabled == true)

我有一个从文本框向数据库添加值的程序

我需要提供一种方法,如果增加的值不是唯一的,它应该返回一条错误消息。但我目前的代码无法做到这一点。即使该值不是唯一的,也会将数据保存在数据库中

下面是我的代码

try
        {
            if (runningExperimentToolStripMenuItem.Enabled == true && newExperimentToolStripMenuItem.Enabled == true)
            {
                MessageBox.Show("Select experiment type (under menu item 'File') first, Running or New.", "Experiment Type Required", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                if (sqlconf2.State == ConnectionState.Closed)
                sqlconf2.Open();
                //after connection is open, using following "if" code to check uniqueness of Step
                string query = "Select * from ExpData where 'Animal ID' = '" + textBox5.Text.Trim() + "' and Step = '" + comboBox2.Text.Trim() + "'";
                SqlDataAdapter sda = new SqlDataAdapter(query, sqlconf2);
                DataTable dtbl = new DataTable();
                sda.Fill(dtbl);
                if (dtbl.Rows.Count > 0)
                {
                    MessageBox.Show("This step has already been executed for the chosen animal ID. Please recheck. \n'Step' requires a numeric value from the drop down list. ", "Step Already Executed.", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation);
                }
                else
                {//code to add data into database
                    }
                }
                
                sqlconf2.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error Message");
            MessageBox.Show("If problem persists, check trouble shooting options in user manual or on our website.", "Trouble Shooting.", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        finally
        {
            datadisplay();
        }

有两种方法可以对其进行微调

不接触数据库

更新查询以仅选择1列而不是**选择不必检查记录是否存在的所有列。 字符串查询=从ExpData中选择[Animal ID],其中'Animal ID'='+ textBox5.Text.Trim+'和Step='+comboBox2.Text.Trim+'

还可以使用Exists方法返回布尔值 字符串查询=选择出口从ExpData中选择[Animal ID],其中“Animal ID”='+ textBox5.Text.Trim+'和Step='+comboBox2.Text.Trim+'

如果我们更改脚本,则可以使用sqlcommand.ExecuteScalar函数仅获取select语句中包含的列/布尔值

对数据库进行更改

在表ExpData上添加唯一键约束。唯一键应同时包含列Animal ID和Step。 现在,在代码中,您可以使用try-catch块。如果没有重复记录,则插入将成功。但如果记录是重复的,则会有例外。 保存到try块中的数据库代码 在catch块中,检查异常类型和错误代码,查看插入是否由于唯一键而失败。检查这个线程, 我建议的方法

在两列上添加唯一键约束 创建一个存储过程 将整个插入数据作为输入 检查记录是否存在,然后返回-1 =如果不存在记录,则插入新数据并返回新记录的id。 在代码中,您可以只检查返回值。如果该值为非负值,则插入成功,否则将向用户显示消息。 如果可以更改数据库,那么如果没有重复数据,则可以减少一次数据库调用


另外,您还可以使用对象-关系映射框架(如实体框架等)使其更加简单,但这是一个很大的变化。

您是否控制数据库,如果是这样,您可以创建多列唯一约束。然后将db save方法包装在try块中。如果唯一约束失败,此代码将引发任何异常。您可以捕获SqlException并检查错误代码。如果ErroCode为2627,则它是唯一约束,您可以显示消息。其他异常和错误代码可按要求处理。检查@RameshKanjinghat我已经把它放在Try-Catch块中了。我已经更新了我的问题,将其包括在内。请看一看。我对编码还不熟悉,希望您能帮助我发现这里的问题。还要注意,当我输入的参数为dtbl.rows.count==0时,它返回所需的消息框。为什么会这样?我的解决方案还包括对数据库和代码进行更改。如果您想坚持现在的做法,那么我认为问题在于查询列animalid中有一个空格,该列用单引号括起来。单引号使其成为文字字符串值,而不是列名。第1步:删除单引号第2步:如果动物和ID之间有空格,则用方括号括起来。在下面的查询中尝试从ExpData中选择*,其中[Animal ID]='+textBox5.Text.Trim+'和步骤='+comboBox2.Text.Trim+';在整个代码和sql查询中也有更多的改进空间,但现在让我们来实现这一点。请告诉我更改查询后的情况。@RameshKanjinghat嗨。它工作得很好。谢谢。您还提到了哪些其他可能的改进?