【问题标题】:Inserting datetime as string C# SQL-server将日期时间作为字符串插入 C# SQL-server
【发布时间】:2016-05-09 21:40:14
【问题描述】:

我有一个 SQL 服务器和一个名为 CitizenshipDate 的列。该列在 SQL 中属于 datetime 类型。

但是,问题在于它的值'0' 不是日期时间值,而是字符串值。

所以我要做的是在插入值时将其作为 C# 中的字符串处理,但得到错误:

从字符串转换日期时间时转换失败。

我收到该错误是因为我试图将字符串插入 SQL 服务器中的日期时间。

这是我的代码:

 class Person {
       public string PersonalIdentityNumber { get; set; }
       public string SpecialIdentityNumber { get; set; }
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string CitizenshipDate { get; set; }

}



  List<FolkbokforingspostTYPE> deserializedList = new List<FolkbokforingspostTYPE>();
            deserializedList = Deserialize<List<FolkbokforingspostTYPE>>();


            var myPersons = Deserialize<List<FolkbokforingspostTYPE>>()
                .Select(x => new Person
                {
                    PersonalIdentityNumber = x.Personpost.PersonId.PersonNr,
                    SpecialIdentityNumber = x.Personpost.PersonId.Tilltalsnamnsmarkering != null ? x.Personpost.PersonId.Tilltalsnamnsmarkering : null, 
                    LastName = x.Personpost.Namn.Efternamn,
                    FirstName = x.Personpost.Namn.Fornamn,
                    CitizenshipDate = x.Personpost.Medborgarskap != null ? x.Personpost.Medborgarskap.Medborgarskapsdatum : null             

                });



            string connetionString = null;


            SqlDataAdapter adpter = new SqlDataAdapter();
            DataSet ds = new DataSet();
            XmlReader xmlFile;



            connetionString = "Data Source=tsrv2062;Initial Catalog=Bums;User ID=BumsUser;Password=2tusen7Bums";


            xmlFile = XmlReader.Create("navetout.xml", new XmlReaderSettings());
            ds.ReadXml(xmlFile);


            using (var connection = new SqlConnection(connetionString))
            {
                connection.Open();
                DateTime datum = DateTime.Now;
                string LastChangedBy = "System";

                foreach (Person p in myPersons)
                {

                    SqlCommand command1 = Avreg(p.UnregistrationReason, p.GivenNameNumber,p.ProtectedIdentity, p.CitizenshipDate, connection);


                    command1.Parameters.AddWithValue("@PersonalIdentityNumber", string.Format("{0}{1}", p.PersonalIdentityNumber, p.SpecialIdentityNumber));
                    command1.Parameters.AddWithValue("@FirstName", p.FirstName);
                    command1.Parameters.AddWithValue("@LastName", p.LastName);
                    command1.ExecuteNonQuery();

                    Console.WriteLine(string.Format("{0}{1}", p.PersonalIdentityNumber, p.SpecialIdentityNumber));


                }
            }

            Console.WriteLine("Done");


           // }// Put a break-point here, then mouse-over PersonalIdentityNumber...  deserializedList contains everything if you need it
           //catch (Exception)
           // {

           //     throw;
           // }
            Console.ReadKey();
        }

        public static SqlCommand Avreg(string s, string t, string p, string c, SqlConnection connection)
        {
            var query = "UPDATE Seamen SET FirstName = @FirstName, "+
                "LastName = @LastName, "+

            SqlCommand command1;


//Here is the `CitizenshipDate` 
            if (c == "0")
            {
                query += ", CitizenshipDate = '0'";
                command1 = new SqlCommand(query, connection);
                command1.Parameters.Clear();



            }
            else
            {
                query += ", CitizenshipDate = @CitizenshipDate";
                command1 = new SqlCommand(query, connection);
                command1.Parameters.Clear();
                command1.Parameters.AddWithValue("@CitizenshipDate", c ?? DBNull.Value.ToString());

            }


//Ignore these if statements
             if ((!string.IsNullOrEmpty(s)) && !string.IsNullOrEmpty(t))
            {

            }
            else
            {

                    query += ", GivenNameNumber = @GivenNameNumber WHERE PersonalIdentityNumber = @PersonalIdentityNumber";
                    t = "00";
                    command1 = new SqlCommand(query, connection);
                    command1.Parameters.Clear();
                    command1.Parameters.AddWithValue("@GivenNameNumber", t ?? DBNull.Value.ToString());

                    return command1;

            }
             return command1;
        }

请注意,我无法更改数据库中的类型。我不知何故需要一种从字符串中插入值的方法。 有人可以帮忙吗?

【问题讨论】:

  • 在这种情况下,你必须决定当它的值为'0'时你需要输入什么日期
  • 0 不是日期时间的正确值。试试CitizenshipDate = NULL
  • @Wudge 可能是 null 值是不允许的
  • @PranavPatel 你是什么意思?能举个例子吗?
  • 你的日期是否允许Null 值?

标签: c# sql-server


【解决方案1】:

如果该列不允许空值,则可以使用NULL 表示“0”,然后在代码中,在加载记录时,在UI 中将NULL 替换为“0”。或者,如果您确实允许 NULLS 并且需要另一个值来表示“0”,您可以使用通常不会使用的任意日期,例如 '1/1/1753'(SQL 日期时间的最小值)或 '1/1 /1900'(smalldatetime 的最低值)或类似的东西。这些日期的任何日期都表示“0”。所以转换为“0”发生在应用程序内,而不是存储在数据库中。

【讨论】:

    【解决方案2】:

    如果您的列支持 null,您可以这样修复它:

            if (c == "0")
            {
                query += ", CitizenshipDate = NULL--instead of '0'";
    

    如果它不支持 NULL 值,则必须插入一个默认值,例如 DateTime.MinValue。

    【讨论】:

      猜你喜欢
      • 2021-06-26
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多