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

c#注册表格:可选文本框

c#注册表格:可选文本框,c#,database,textbox,optional,C#,Database,Textbox,Optional,我正在做一个需要注册选项的项目。我已经创建了一个用户可以填写的表单,如果每个文本框都已填写,它将成功保存到数据库中。我需要有一些是可选的 private void button1_Click(object sender, EventArgs e) { Registercar(textBox1.Text, textBox2.Text, Convert.ToInt32(textBox3.Text)); } private static void Regis

我正在做一个需要注册选项的项目。我已经创建了一个用户可以填写的表单,如果每个文本框都已填写,它将成功保存到数据库中。我需要有一些是可选的

private void button1_Click(object sender, EventArgs e)
    {

        Registercar(textBox1.Text, textBox2.Text, Convert.ToInt32(textBox3.Text));
    }

    private static void Registercar(string make, string model, int year)
    {
        var con = GetConnection();
        try
        {
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = con;
            cmd.CommandText = "INSERT INTO user_car (ID,make,model,year) VALUE (@ID, @make, @model, @year)";
            cmd.Prepare();
            cmd.Parameters.AddWithValue("@ID", 0);
            cmd.Parameters.AddWithValue("@make", make);
            cmd.Parameters.AddWithValue("@model", model);
            cmd.Parameters.AddWithValue("@year", year);
            cmd.ExecuteNonQuery();
            if (con !=null) { con.Close(); };

            MessageBox.Show("Car successfully registered");
        }
        catch (Exception ex)
        {
            MessageBox.Show(Convert.ToString(ex));
        }
        finally
        {
            con.Close();
        }
    }
上面的代码是注册的一部分,用户可以选择注册一辆与其帐户绑定的汽车。如果他们选择添加汽车,他们需要输入品牌和型号,而年份是可选的。如果他们输入了所有信息,它会成功地将信息保存到数据库中

但是,如果尝试将“年份”选项保留为空,则会出现以下错误: mscorlib.dll中发生“System.FormatException”类型的未处理异常

其他信息:输入字符串的格式不正确。“

这告诉我,我很可能不允许将其留空。我试图找出不同的选项,在那里我可以将其保留为空白,但仍然可以将其他信息保存到数据库中。 我尝试的第一个选择来自以下帖子: 我尝试将年份设置为可选,方法是在我的年份参数中输入一个默认值:

private static void Registercar(string make, string model, int year = 0)
然而,我仍然得到与以前相同的错误。我尝试的下一个选项来自于这篇文章: 第一个答案与前一个答案相同,将参数设置为设定值。下面的另一个答案建议使用“System.Runtime.InteropServices”,并将参数设置为[可选]。我试过了,但还是犯了和以前一样的错误。 我想这与我试图将空字符串转换为int有关。快速搜索使我找到了这篇文章: 这里我被告知我可以尝试使用int.Parse,所以我像这样设置它

private void button1_Click(object sender, EventArgs e)
    {
        int year = int.Parse(textBox3.Text.Trim());
        Registercar(textBox1.Text, textBox2.Text, year);

    }
和以前一样的错误。 接下来,我尝试了“Int32.TryParse()”,它检查字符串是否包含int,如果不包含int,则输出一个整数值

private void button1_Click(object sender, EventArgs e)
    {
        int year;
        string str = textBox3.Text.Trim();
        Registercar(textBox1.Text, textBox2.Text, Int32.TryParse(str, out year);

    }
现在它告诉我我不能从'bool'转换为'int'

在这一点上,我几乎放弃了

目前有效的方法是,如果每个框都填写好,它会成功地将信息保存到数据库中。然而,我需要一些文本框是可选的,我不能让它工作


很抱歉发了这么长的邮件。我希望有人能提供帮助或提供建议:)

使用int.TryParse方法检查年份是否是这样的真实数字

int nYear=0;
if(int.TryParse(txtYear.Text, out nYear)
{
    //the value is a number
    //Also the nYear vairable has the numeric integer value
    //    you can use it
}
else
{
    //The value isn't a number
}

如果我错了,请纠正我,但我认为您唯一的问题是将文本转换为字符串。在这里,将一些参数设置为可选并不是真正必要的

int.TryParse()
TryParse
返回
bool
,这意味着转换成功(值
true
)或失败(值
false
)。整数值是in
out
变量。因此,要在您的案例中使用它,请尝试以下方法:

private void button1_Click(object sender, EventArgs e)
{
    int year;
    string str = textBox3.Text.Trim();
    //if parsing isn't successful, year will be set as 0
    if (!int.TryParse(str, out year))
    {
        //notice user that that isn't correct value for year
        year = 0;
    }
    //no need for else, year now contains int value but beware, it can be value from 0  to 2147483647

    Registercar(textBox1.Text, textBox2.Text, year));

}
if (year != 0)
    cmd.Parameters.AddWithValue("@year", year);
else
    cmd.Parameters.AddWithValue("@year", DBNull.Value);
如果您对“可选”参数或该
年份的附加处理有其他问题,请随时提问。或者,编辑您的原始问题

编辑:

若要在year==0时将
null
nothing
插入数据库,可以传递如下参数:

private void button1_Click(object sender, EventArgs e)
{
    int year;
    string str = textBox3.Text.Trim();
    //if parsing isn't successful, year will be set as 0
    if (!int.TryParse(str, out year))
    {
        //notice user that that isn't correct value for year
        year = 0;
    }
    //no need for else, year now contains int value but beware, it can be value from 0  to 2147483647

    Registercar(textBox1.Text, textBox2.Text, year));

}
if (year != 0)
    cmd.Parameters.AddWithValue("@year", year);
else
    cmd.Parameters.AddWithValue("@year", DBNull.Value);

我懂了。我用错了int.TryParse,这是有道理的,我让它工作了。非常感谢:)。不过,我可以简单地问一下,我可以将年份设置为空字符串吗?所以在我的数据库中,在“年”下,它将只是空的,而不是显示“0”?我已经编辑了我的答案。顺便说一句,要说“谢谢”,你可以把我的答案标记为解决方案;)啊,是的,对不起。与此同时,我正在做一些其他的事情,却忘了:)再次感谢!