Sql 为什么我不能将字符串转换为DateTime?

Sql 为什么我不能将字符串转换为DateTime?,sql,asp.net-mvc,web-services,datetime,Sql,Asp.net Mvc,Web Services,Datetime,我不能转换这个字符串,有人能帮我吗 [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 (Sql

我不能转换这个字符串,有人能帮我吗

[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(字符串s、字符串格式、DateTimeFormatInfo dtfi、DateTimeStyles样式)
em onipresentAPI.oni.InsertUsuario(字符串Usario、字符串senha、字符串nome、字符串dtnasc、字符串fone、字符串email、Int32 oab、字符串endereco、字符串bairro、字符串cep、Int32编码、字符串cpf、字符串cnpj)


该问题基于您将s日期字符串“1991-12-21 00:00”传递到
DateTime.ParseExact()
中的注释。线索在异常中,由于第二个参数
format
参数不正确,异常被触发

您的参数是
“yyyy'-'MM'-'dd'T'HH':'MM”
。正确的格式应为
“yyyy-M-dd hh:mm”
。阅读文档,特别是本区域:

DateTime.ParseExact(字符串, 一串 提供程序, 日期时间样式) 方法解析日期的字符串表示形式,该日期必须在 由format参数定义的格式。它还要求 s中的时间元素按格式指定的顺序显示。如果是 与format参数的模式不匹配,具有任何 由style参数定义的变体,该方法抛出 格式化异常

以下是我的工作示例:

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);
        }
    }
}

您也可以使用
格式
字符串。

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