代码之家  ›  专栏  ›  技术社区  ›  mahesh

“DD/MM/YYYY”格式参数化Sql查询中日期格式的解决方案

c#
  •  0
  • mahesh  · 技术社区  · 14 年前

    datetimepicker确实解决了所有类型的日期相关问题,而masked textbox返回一个字符串,这就是为什么它要在C#中的参数化sql查询中创建日期时间转换问题。

    在大多数情况下,由于时间消耗问题,我们不使用datetimepicker。我的意思是,如果有数千个数据输入挂起,如果我们使用datetimepicker,那么鼠标和键盘之间的指针是分开的。因此,在我的例子中,我总是使用maskedtextbox,它会产生日期转换的问题。我试着用以下方法来解决这个问题:

    String sql="insertintodummy(name,date)values(@name,convert(datetime,'"+maskedTextBox1.text+"', 103)"; //  for 'dd/mm/yyyy' format.
    sqlcommand cmd=new sqlcommand(sql,con);
    cmd.parameters.Add("@name",SqldbType.Varchar).Value= textbox1.text;
    cmd.ExecuteNonQuery();
    

    我认为在使用C#,VS-2005的参数化查询中无法使用上述日期时间转换。

    上面的代码在只有日期字段必须输入的情况下很有用。如果有比这更好的方法,请建议。

    下面是完美的解决方案。

    string sql="insert into dummy(name,date)values(@name,@date)";
    
    IFormateprovider Culture = new CultureInfo("fr-FR",True);
    
    DateTime mydate=DateTime.parse(
    maskedtextbox1.text,Culture,DateTimeStyles.NocurrentDateDefault
    );
    
    sqlcommand cmd=new sqlcommand(sql,con);
    
    cmd.Parameters.Add(@name,SqlDbtypes.Varchar).Values= Textbox1.text;
    
    cmd.Parameters.Add(@date, SqlDbtypes.Datetime).Values=mydate;
    
    cmd.ExecuteNonQuery();
    

    1 回复  |  直到 14 年前
        1
  •  7
  •   Rob    14 年前

    为什么在Sql中进行转换( 只需部分参数化您的查询就可以避免风险注入 )当有一个非常好的参数 SqlDbType.DateTime 只是乞求被利用:

    string sql = "insert into dummy (name, date) values (@name, @date)";
    SqlCommand cmd = new SqlCommand(sql, con);
    cmd.Parameters.Add("@name", SqldbType.Varchar).Value = textbox1.text;
    cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = Convert.ToDateTime(maskedTextBox1.Text);
    cmd.ExecuteNonQuery();
    

    • 不检查maskedTextBox1.Text是否实际包含日期时间( DateTime.TryParse
    • 不检查提供的DateTime是否在DateTime的范围内SqlDbType.DateTime手柄