【问题标题】:Why can not I convert a string to DateTime?为什么我不能将字符串转换为 DateTime?
【发布时间】:2017-07-14 14:17:35
【问题描述】:

我无法转换这个字符串,谁能帮帮我?

[WebMethod]
public void InsertUsuario(string usuario, string senha, string nome, string dtnasc, string fone, string email, int oab, string endereco, string bairro, string cep, int codcidade, string cpf, string cnpj)
{
    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
    {
        string chav = "asfasdf";
        DateTime d = DateTime.ParseExact(dtnasc, "yyyy'-'MM'-'dd'T'HH':'mm", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

        SqlCommand command = new SqlCommand("INSERT Into Usuarios (IdUsuario, Usuario, Senha, Nome, Chave, DtNasc, Fone, Email, OAB, Endereco, Bairro, CEP, CodCidade, CPF, CNPJ) VALUES ((Select MAX(idusuario)+1 from Usuarios), '" + usuario + "', '" + senha + "', '" + nome + "', '" + chav + "', '"+d+ "', '" + fone + "', '" + email + "', " + oab + ", '" + endereco + "', '" + bairro + "', '" + cep + "', " + codcidade + ", '" + cpf  + "','"+cnpj+"')");

        //command.Parameters.Add("@dtnasc", SqlDbType.DateTime).Value = DateTime.Now;
        command.Connection.Open();
        command.ExecuteNonQuery();
    }
}

这是出现的错误:

System.FormatException: Cadeia de caracteres não foi reconhecida como DateTime válido.
em System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style)
em OniPresenteAPI.oni.InsertUsuario(String usuario, String senha, String nome, String dtnasc, String fone, String email, Int32 oab, String endereco, String bairro, String cep, Int32 codcidade, String cpf, String cnpj)

【问题讨论】:

  • 使用参数化 SQL。您对 SQL 注入攻击完全开放。不仅如此,如果你使用参数化 SQL,它甚至可以解决这个问题,因为将字符串连接在一起形成一个 SQL 脚本非常容易出错,就像你得到的那样。
  • 除了sql注入问题,还有哪些字符串无法解析?你甚至没有展示一个例子。
  • dtnasc 的确切值是多少?
  • 您传入的日期时间到底是什么样的?使用DateTime.ParseExact() 方法需要您完全匹配该格式。您目前在 DateTime 字符串中的每个部分都用单引号括起来,但开头和结尾除外,所以我认为 that 可能是一个问题,但没有示例,我们只是猜测。 ..
  • 我试图传递的值是:“1991-12-21 00:00”

标签: sql asp.net-mvc web-services datetime


【解决方案1】:

基于您将 "1991-12-21 00:00" 的日期字符串传递给 DateTime.ParseExact() 的评论的问题。线索在 Exception 中,因为第二个参数 format 参数不正确。

您的参数是"yyyy'-'MM'-'dd'T'HH':'mm"。正确的格式应该是"yyyy-M-dd hh:mm"。阅读文档here,特别是这个区域:

DateTime.ParseExact(String, String, IFormatProvider, DateTimeStyles) 方法解析日期的字符串表示形式,它必须在 格式参数定义的格式。它还要求日期 和 s 中的时间元素按格式指定的顺序出现。如果 与格式参数的模式不匹配,任何 由样式参数定义的变化,该方法抛出一个 格式异常。

这是我的工作示例:

using System;
using  System.Globalization;
public class Program
{
    public static void Main()
    {
        string dateAsAString = "1991-12-21 00:00";
        try
        {   
            DateTime d = DateTime.ParseExact(dateAsAString, "yyyy-M-dd hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
            Console.WriteLine("The correct Date is " + d.ToString());
        }
        catch (FormatException)
        {
                Console.WriteLine("{0} is not in the correct format.", dateAsAString);
        }
    }
}

一个有效的dotnetfiddle 也可以让你玩弄format 字符串。

【讨论】:

    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2021-03-31
    • 2018-10-26
    相关资源
    最近更新 更多