2016-05-09 6 views
1

私はSQLサーバとCitizenshipDateというカラムを持っています。その列のタイプはdatetimeです。文字列としてdatetimeを挿入する#SQL-server

ただし、値は'0'で、日時の値ではなく文字列の値である可能性があります。

それでは、私がやろうとしているが、それは値が、エラーを取得する挿入時にC#での文字列として処理することです:

Conversion failed when converting datetime from character string.

私はに文字列を挿入しようとしているので、私はそのエラーを取得します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; 
     } 

私は、データベースのタイプを変更することはできませんのでご注意ください。私は何とかStringから値を挿入する方法が必要です。 誰かを助けることができますか?

+2

この場合、値が '0'のときに入力する必要がある日付を指定する必要があります。 –

+0

'0'はdatetimeの適切な値ではありません。 "CitizenshipDate = NULL"を試してください – Wudge

+0

@Wudgeはnullの可能性があります。 –

答えて

1

NULLを許可しない場合、NULLを使用して "0"を表すことができます。その後、レコードをロードするときにコード内でNULLを "0"に置き換えます。または、NULLSを許可し、 "0"を表す別の値が必要な場合は、通常は使用しない任意の日付を '1/1/1753'(SQL datetimeの最小値)または '1/1/1900 '(smalldatetimeの場合は最低)などです。これらの日付である日付はすべて「0」を表します。つまり、アプリケーション内では "0"への変換が行われ、データベースには格納されません。

1

あなたの列には、あなたがこのようにそれを修正することができ、ヌルサポートしている場合:それはあなたがそのようなDateTime.MinValueとしてデフォルト値を挿入する必要がありますNULL値をサポートしていない場合は

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

関連する問題