C# 根据与sql查询的比较,提示用户输入超出范围

C# 根据与sql查询的比较,提示用户输入超出范围,c#,sql-server,winforms,C#,Sql Server,Winforms,简单地说,我有一个文本框,我的用户将在风扇rpm中输入。 我需要我的程序获取输入的fanrpm,并将其与名为classrpm的数据库项进行比较。我从数据库中的查询将只返回1项 我需要fanrpm>classrpm,如果fanrpm>=classrpm,则弹出一个消息框,说明“fanrpm超过classrpm(即x),请在classrpm下输入一个值 下面的代码是我用假变量名进行的测试。我尝试获取并转换用户输入的文本和数据库检索项,然后使用转换后的值执行上述if语句,然后输出一个消息框,通知我是否

简单地说,我有一个文本框,我的用户将在风扇rpm中输入。 我需要我的程序获取输入的fanrpm,并将其与名为classrpm的数据库项进行比较。我从数据库中的查询将只返回1项

我需要fanrpm>classrpm,如果fanrpm>=classrpm,则弹出一个消息框,说明“fanrpm超过classrpm(即x),请在classrpm下输入一个值

下面的代码是我用假变量名进行的测试。我尝试获取并转换用户输入的文本和数据库检索项,然后使用转换后的值执行上述if语句,然后输出一个消息框,通知我是否成功

  private void textBox1_TextChanged(object sender, EventArgs e)
   {
        txfanrpm.MaxLength = 4
        string classrpm;
        string fanrpm;
        using (Fanrpm ds = new Fanrpm(cbdesigntype.SelectedValue.ToString(), cbfansize.SelectedValue.ToString(), cbfanclass.SelectedValue.ToString()))
        {
            DataTable dt = ds.dataset.Tables[0];
            List<string> coolList = new List<string>();

            foreach (DataRow row in dt.Rows)
            {
                coolList.Add(row[0].ToString());
            }

            classrpm = coolList.ToString();
            fanrpm = txfanrpm.Text.ToString();
            int classrpmInt;
            int fanrpmInt;
            classrpmInt = Convert.ToInt32(classrpm);
            fanrpmInt = Convert.ToInt32(fanrpm);
            if (fanrpmInt >= classrpmInt)
            {
                MessageBox.Show(this, "user entered fanrpm higher then class rpm which is yadda yadda");
            }
            else if (fanrpmInt < classrpmInt)
            {
                MessageBox.Show(this, "Fanrpm is less then Classrpm");
            }
        }


    }
private void textBox1\u TextChanged(对象发送者,事件参数e)
{
txfanrpm.MaxLength=4
字符串类RPM;
串扇转速;
使用(Fanrpm ds=新的Fanrpm(cbdesigntype.SelectedValue.ToString()、cbfansize.SelectedValue.ToString()、cbfanclass.SelectedValue.ToString())
{
DataTable dt=ds.dataset.Tables[0];
List coolList=新列表();
foreach(数据行中的数据行)
{
添加(行[0].ToString());
}
classrpm=coolList.ToString();
fanpm=txfanpm.Text.ToString();
int classrpmInt;
int fanrpmInt;
classrpmInt=Convert.ToInt32(classrpm);
fanrpmInt=转换为32(fanrpm);
if(fanrpmInt>=classrpmInt)
{
Show(这是“用户输入的fanrpm高于类rpm,即yadda yadda”);
}
else if(fanpmint
我相信我的问题源于将我的数据库项转换为可用于比较的内容。此外,我认为如果我的设置按预期工作,它可能会告诉用户在每个输入中输入500,文本框将刷新并重新执行查询,从而导致潜在的处理能力浪费


-“编辑我的sql语句”可以工作,但将数据放入列表可能是我的问题之一。

无法通过这种方式将列表(字符串)转换为单个字符串。
如果用户在文本框中键入的不是数字,该怎么办

然而,如您所说,如果DataTable始终只包含一行,那么您可以将代码简化为如下内容

private void textBox1_TextChanged(object sender, EventArgs e)
{
    int classRPM;
    int fanRPM;
    using (Fanrpm ds = new Fanrpm(....)
    {
        DataTable dt = ds.dataset.Tables[0];

        // Get and convert the value in the field named ClassRPM (assuming is a string)
        classRPM = Convert.ToInt32(dt.Rows[0].Field<string>("ClassRPM"));

        // Now check if the textbox contains a valid number
        if(!Int32.TryParse(txfanrpm.Text, out fanRPM))
        {
            MessageBox.Show("Not a number....");
            return;
        }

        // Start your logic
        if (fanRPM >= classRPM)
        {
            MessageBox.Show(.....);
        }
        else if (fanRPM < classRPM)
        {
            MessageBox.Show(.......);
        }
    }
}
private void textBox1\u TextChanged(对象发送者,事件参数e)
{
int-classRPM;
int fanRPM;
使用(风扇转速ds=新风扇转速(..)
{
DataTable dt=ds.dataset.Tables[0];
//获取并转换名为ClassRPM的字段中的值(假设为字符串)
classRPM=Convert.ToInt32(dt.Rows[0]。字段(“classRPM”);
//现在检查文本框是否包含有效数字
如果(!Int32.TryParse(txfanpm.Text,out fanpm))
{
MessageBox.Show(“不是数字…”);
返回;
}
//开始你的逻辑
如果(fanRPM>=classRPM)
{
MessageBox.Show(…);
}
否则如果(风扇转速<类转速)
{
MessageBox.Show(……);
}
}
}
我认为TextChanged事件不是此类代码的合适位置。这将在用户每次按键时触发,并导致每次按键都会访问数据库。因此,如果用户想要键入500,则首先要求db输入“5”,然后是“50”,最后是“500”

我更愿意让用户自由键入其值,然后在按下验证按钮时进行检查,或者,如果不可能的话,在事件中进行检查。

调用List.ToString()只返回“System.Collections.Generic.List`1[System.String]”,而不返回字符串中的任何项方法实际上是从对象继承的,只返回表示对象类型的字符串,但StringBuilder等特殊情况除外。)


我会避免TextChanged事件,因为该事件会导致代码执行任何按键操作,当部分输入值时,或当用户意外输入无效值并必须退格时,可能会导致错误。

选择更好的变量名。狗、猫、吠叫和喵喵都不是描述性的或有用的。您使用过吗r debugger以单步执行代码?更改了它以使其有意义。正如您发布的那样,我正在考虑这一点。我使用了调试器,sql语句将数据拉入列表中。从那里开始,第一个问题是它不会移动到我的classrpm字符串中。在按下任何按钮之前,都会进行其他选择,我可以将它绑定到t在这个文本框下面有一个组合框,这样用户就可以输入数据,然后在检查并通知他们之前继续,我也已经有代码来确保用户输入的只是数字,只是没有包含它。我尝试了你的代码,稍微修改了一下,我遇到了一个问题,Classrpm=convert.ToInt32(dt.rows…)工作不正常,或者/然后它跳过了逻辑部分并继续。这可能正是您提出的控制。验证和我也会研究这一点,但如果您对此有任何见解,请注意:dw设置ClassRpm变量的行中出现了什么错误?可能是您发布了一个新问题并更新了代码我们可以检查新情况。在这里发布一个新问题的链接,基本上是单步执行,点击classrpm=convert行,然后跳过逻辑的if语句。我将创建一个新问题,我添加了一些内容以过滤掉字符。只需检查以确保您的字段名为classrpm,并且该行包含一个数字val可以转换为整数的ue我没有选择通过单击事件让它工作,但是我的程序有一系列组合框,这个文本框前5个,后2个,我可以