2016-05-09 14 views
1

Ich habe einen SQL-Server und eine Spalte namens CitizenshipDate. Diese Spalte ist vom Typ datetime in SQL.Einfügen von datetime als String C# SQL-Server

Das Problem ist jedoch, dass es den Wert '0' haben kann, der kein Datetime-Wert ist, sondern ein String-Wert.

Also, was ich versuche zu tun, es als String in C# zu behandeln, wenn es Werte einfügen, aber den Fehler:

Conversion failed when converting datetime from character string.

ich diesen Fehler, weil ich versuche, String einfügen in eine Datetime im SQL-Server.

Hier ist mein Code:

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

Bitte beachten Sie, dass ich nicht die Art in der Datenbank ändern kann. Ich brauche irgendwie eine Möglichkeit, den Wert aus String einzufügen. Kann jemand helfen?

+2

In diesem Fall müssen Sie entscheiden, welches Datum Sie eingeben müssen, wenn der Wert '0' ist. –

+0

'0' ist kein geeigneter Wert für datetime. Versuchen Sie 'CitizenshipDate = NULL' – Wudge

+0

@Wudge kann Nullwert ist nicht erlaubt –

Antwort

1

Wenn die Spalte Nullen nicht zulässt, können Sie NULL verwenden, um "0" darzustellen, und dann im Code beim Laden des Datensatzes NULL durch "0" in der Benutzeroberfläche ersetzen. Oder wenn Sie NULL zulassen und einen anderen Wert für "0" benötigen, können Sie ein beliebiges Datum verwenden, das Sie normalerweise nicht verwenden würden wie '1/1/1753' (der niedrigste Wert für SQL datetime) oder '1/1/1900 '(am niedrigsten für smalldatetime) oder so ähnlich. Jedes Datum, das diese Daten darstellt, repräsentiert "0". Die Konvertierung in "0" erfolgt also innerhalb der App und nicht in der Datenbank.

1

Wenn Ihre Spalte null unterstützt, können Sie es wie folgt beheben:

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

Wenn es nicht NULL-Werte nicht unterstützt wird, müssen Sie wie DateTime.MinValue einen Standardwert ein.