2017-07-27 1 views
-1

Ich erhalte eine Fehlermeldungeinen Fehler bekommen, während Einfügen von Daten unter Verwendung der gespeicherten Prozedur in mvc Entity Framework

Umwandlung Datentyp nvarchar in Datetime.

Wo habe ich Fehler gemacht?

Dies ist meine gespeicherte Prozedur, durch die ich Daten einfügen möchte. Was kann ich tun ?

INSERT INTO tblTicketChat 
(
TicketId, 
FullName, 
[Description], 
LastCorrespondanceOn, 
LastCorrespondanceBy 

) 
    VALUES 
    (
@TicketId, 
@FullName, 
@Description, 
GETDATE(), 
@LastCorrespondanceBy) 
+0

Sie benötigen eine Frage bearbeiten Sie den Code der gespeicherten Prozedur zeigen – Alex

+0

ich bearbeiten kindly überprüfen. –

+0

Warum rufen Sie 'GETDATE(),' AND und geben Sie ein Datum ein? – Alex

Antwort

0

Jetzt habe ich die Ursache des Problems, dem Sie gegenüberstanden.

Idealerweise sollte DateTime.Now.ToString() in den Datetime-Datentyp von SQL Server konvertiert worden sein, wenn er dem Parameter @LastCorrespondanceOn Ihrer gespeicherten Prozedur zugewiesen wurde, aber eine Ausnahme ausgelöst wurde.

Der Grund ist die Datumsformateinstellungen Ihres Betriebssystems.

Die Sache ist, wenn Sie DateTime.Now.ToString() in Ihrem C# -basierten Client-Code ausführen, nimmt es die Standardeinstellungen des Datums-Zeit-Format von Ihrem Betriebssystem. Schauen Sie sich das Datum Zeitformat zur Zeit eingestellt auf meinem Windows 10 Kasten:

enter image description here

Aufgrund dieser Einstellung den Code DateTime.Now.ToString()27-07-2017 18:07:37 emittiert. Die Ausgabe, die Sie sehen, ist dd-MM-yyyy Format.

Jetzt ist dieses dd-MM-yyyy Datumsformat für SQL Server gemäß Ihren Standardeinstellungen nicht erkennbar.

SQL Server können zwei Datumszeitformate erkennen, wenn sie als Zeichenfolge von Client-Seite

  1. Internationales Datumsformat yyyy-MM-dd auch bekannt als ISO 8601 gesendet.
  2. Datumsformat, das durch die Dateformat-Einstellung des Benutzer-Logins gesteuert wird. Sie können den Befehl dbcc useroptions ausführen, um den Wert der Einstellung anzuzeigen. Für mich ist es zu mdy

Aufgrund dieser Diskrepanz in dem Datum Zeitformat wird von C# -Code gesendet (wegen Ihres Betriebssystems) und welche SQL Server analysieren kann, konfrontiert Sie das Problem festgelegt ist.

Wenn Sie die Konvertierung explizit durch date.ToString("yyyy-MM-dd"); durchgeführt haben, haben Sie einfach ISO 8601 International Date Time Format von SQL Server unterstützt so ausgerichtet, dass es zu arbeiten begann.

Das Standard Datum Zeitformat (ISO 8601) von SQL Server ist eine Konfiguration der Sortierungs Du derzeit verwenden, die Sie in Ihren SQL Server-Instanz-Eigenschaften überprüfen können, wie unten dargestellt:

enter image description here

Es Es wird dringend empfohlen, dass Sie immer das Datumsformat von SQL verwenden, wenn Sie es im Zeichenfolgenformat übergeben, wie in this Thread erwähnt.

So können Sie Ihr Problem auf drei Arten lösen:

  1. Ändern Sie den Standard-Datumsformat Ihres OS es auf SQL Server auszurichten (nicht empfohlen). Es wird niemals auf allen Client-Computern möglich sein, auf denen Ihre Anwendung ausgeführt wird.
  2. Verwenden Sie benutzerdefiniertes Datumsformat beim Aufrufen der Methode ToString, wie Sie dies getan haben, um es an eines der von SQL Server unterstützten Formate anzupassen. Das beste Format ist das ISO 8601-Format, das Sie verwendet haben.
  3. Nicht in Zeichenfolge konvertieren. Übergeben Sie einfach den Datumswert, wie er ist.

    var exec = db.Database.ExecuteSqlCommand("sp_InsertTicketChat @TicketId, 
    @FullName, @Description, 
          @LastCorrespondanceBy,@LastCorrespondanceOn", 
         new SqlParameter("@TicketId", TicketId), 
         new SqlParameter("@FullName", FullName), 
         new SqlParameter("@Description", Description), 
         new SqlParameter("@LastCorrespondanceBy", FullName), 
         new SqlParameter("@LastCorrespondanceOn", 
          DateTime.Now) //Don't call .ToString here 
         ); 
    

    Ansatz # 3 ist das beste Angebot. Weitere Informationen finden Sie unter here, warum Sie keine Strings verwenden sollten, sondern den Datentyp date time, wenn Sie mit SQL Server datetime-Spalten arbeiten.

+0

immer noch gleichen Fehler. –

+0

@razasarwar es kann nicht der gleiche Fehler sein - haben Sie BEIDE C# und SP wie oben Code – Alex

+0

bearbeitet ja! Ich ändere beide aber immer noch den gleichen Fehler. –

-1

Ich löste dieses Problem, indem ich einige Änderungen vornahm.

DateTime date = DateTime.Now; 
      string strDateTime = date.ToString("yyyy-MM-dd"); 


      var exec = db.Database.ExecuteSqlCommand("sp_InsertTicketChat @TicketId, @FullName, @Description, @LastCorrespondanceOn, @LastCorrespondanceBy", 
       new SqlParameter("@TicketId", TicketId), 
       new SqlParameter("@FullName", FullName), 
       new SqlParameter("@Description", Description), 
       new SqlParameter("@LastCorrespondanceBy", "raza"), 
       new SqlParameter("@LastCorrespondanceOn", strDateTime) 
       ); 
+0

Warum speichern Sie 'LastCorrespondanceOn' als String in der db !? – Alex

+0

@Alex Ich glaube, '@ LastCorrespondanceOn' wird immer noch als' datetime' gespeichert. Sogar eine Zeichenfolge im passenden Datumsformat wird in datetime konvertiert – RBT

+0

@razasarwar Ich habe die Ursache für Ihr Problem gefunden. Bitte sehen Sie meine aktualisierte Antwort. – RBT

0

Ich löse diese Probleme durch MSSQL Zeichenfolge mit formatiert (dd-MM-JJJJ) in meinem StoredProcedure

Verwandte Themen