2009-04-23 6 views
2

Ich versuche, in eine SQL-Datenbank einfügen, aber es funktioniert nicht. Also habe ich den SQL-Server-Profiler verwendet, um zu sehen, wie er die Abfrage erstellt hat. was es zeigt, ist die folgende:SQL Putting zwei einfache Anführungszeichen um Datetime Felder und schlägt fehl, Datensatz

declare @p1 int 
set @p1=0 
declare @p2 int 
set @p2=0 
declare @p3 int 
set @p3=1 
exec InsertProcedureName @[email protected] output, @[email protected] output, 
         @[email protected] output, @ProjectID=N'0', @IPAddress=N'66.229.112.168', 
         @FirstName=N'Mike', @LastName=N'P', @Email=N'[email protected]', 
         @PhoneNumber=N'(254)637-1256', @MobilePhone=NULL, @CurrentAddress=N'', 
         @FromZip=N'10005', @MoveInAddress=N'', @ToZip=N'33067', 
         @MovingSize=N'1', @MovingDate=''2009-04-30 00:00:00:000'', 
           /*  Problem here ^^^ */ 
         @IsMovingVehicle=0, @IsPackingRequired=0, @IncludeInSaveologyPlanner=1 
select @p1, @p2, @p3 

Wie Sie sehen können, bringt es ein doppeltes Anführungszeichen zwei Paare einfacher Anführungszeichen um die Datetime-Felder, so dass es einen Syntaxfehler in SQL erzeugt. Ich frage mich, ob es irgendetwas gibt, das ich irgendwo konfigurieren muss?

Jede Hilfe wäre willkommen. Hier

ist die Umwelt-Details:

  • Visual Studio 2008
  • .NET 3.5
  • MS SQL Server 2005

Hier ist die .NET-Code Ich bin mit .. ..

//call procedure for results 
strStoredProcedureName = "usp_SMMoverSearchResult_SELECT"; 

Database database = DatabaseFactory.CreateDatabase(); 
DbCommand dbCommand = database.GetStoredProcCommand(strStoredProcedureName); 
dbCommand.CommandTimeout = DataHelper.CONNECTION_TIMEOUT; 

database.AddInParameter(dbCommand, "@MovingDetailID", DbType.String, objPropConsumer.ConsumerMovingDetailID); 
database.AddInParameter(dbCommand, "@FromZip", DbType.String, objPropConsumer.FromZipCode); 
database.AddInParameter(dbCommand, "@ToZip", DbType.String, objPropConsumer.ToZipCode); 
database.AddInParameter(dbCommand, "@MovingDate", DbType.DateTime, objPropConsumer.MoveDate); 
database.AddInParameter(dbCommand, "@PLServiceID", DbType.Int32, objPropConsumer.ServiceID); 
database.AddInParameter(dbCommand, "@FromAreaCode", DbType.String, pFromAreaCode); 
database.AddInParameter(dbCommand, "@FromState", DbType.String, pFromState); 
database.AddInParameter(dbCommand, "@ToAreaCode", DbType.String, pToAreaCode); 
database.AddInParameter(dbCommand, "@ToState", DbType.String, pToState); 

DataSet dstSearchResult = new DataSet("MoverSearchResult"); 
database.LoadDataSet(dbCommand, dstSearchResult, new string[] { "MoverSearchResult" }); 
+0

Können Sie auch die Codes posten, die diese SQL-Abfrage generieren? Das Problem ist sehr offensichtlich (doppelte Anführungszeichen und Doppelpunkt zwischen Sekunden und Millisekunden), so dass die Wurzel Ihres Problems in dem Codeabschnitt sein muss, der diese Abfrage generiert hat. –

+0

posten Sie Ihren .net-Code, da die Datumsinformationen von dort korrekt sind? – Eppz

+0

Können Sie den Code (oder ein Beispiel, das das Problem reproduziert), die die Abfrage in erster Linie erstellt, Sie am besten von vorne in der Ausgabe als das Zurück zu veröffentlichen. – Lazarus

Antwort

0

Versuchen Sie dies:

'2009-04-30 00:00:00.000' 

Beachten Sie die einfachen Anführungszeichen und "." anstelle von ":" für die Millisekunden. Oder versuchen Sie dies:

'2009-04-30 00:00:00' 

Um sicherzustellen, dass es nicht die Millisekunden ist.

+0

Ich habe meinen .NET-Code im ursprünglichen Post hinzugefügt. BTW .. Ich benutze Datetime Parameter und addiere kein Zitat auch. – user82613

+1

Hm. Hast du die Frage tatsächlich gelesen? –

3

Ich vermute, dass Sie Ihrem Datetime-Feld einfache Anführungszeichen hinzufügen und es als Zeichenfolge senden? Tu das nicht. Verwenden Sie einen datetime-Typ für den Parameter, und fügen Sie keine Anführungszeichen hinzu.

Es wäre hilfreich, wenn Sie uns die .Net-Seite des Codes gezeigt hätten.

+0

Er ist nicht, nach dem Code. –

+0

@Neil Wow, das ist alt, aber ich beiße. Der Code, den er gepostet hat, beweist nicht, dass es dort keine Zitate gibt. Er teilt den Code für den Typ "objPropConsumer" nicht, und so ist es möglich oder sogar wahrscheinlich, dass es sich bei dem MoveDate-Mitglied nur um eine Zeichenfolge handelt. –

+1

Gehen Sie und werfen Sie einen Blick auf die SQL-Ausgabe von Profiler in seiner Frage und siehe "Problem hier ^^^" direkt unter dem falsch angegebenen Zeitfeld. Es ist ein Fehler in dieser Version von Profiler. Ich versuche nur, Dinge für zukünftige Sucher aufzuräumen - mich eingeschlossen darin. –

0

Ist objPropConsumer.MoveDate eine Zeichenfolge? Es sieht so aus, als wäre es mit einer Zeichenfolge gefüllt, die an Anfang und Ende Apostrophe hat. Versuchen Sie, objPropConsumer.MoveDate durch eine Konstante "2009-04-30 00:00:00" zu ersetzen und sehen Sie, ob das funktioniert. Wenn dies der Fall ist, liegt das Problem darin, wo das MoveDate festgelegt oder konvertiert wird.

1

SP2 oder SP3 soll dieses Problem in Profiler löst

+0

Das behebt es. Siehe auch: http://geekswithblogs.net/influent1/archive/2007/05/31/112897.aspx –

0

ich für das Problem in Ihrer Datenbank-Klasse aussehen würde. Vielleicht führt die AddInParameter() Methode einige jiggery-pokery mit DateTime Parametern aus, wie das Hinzufügen einer formatierten Zeichenkette oder etwas, das so albern ist.

Für die Verwendung mit MSSQL sollte die CreateStoredProc() absolut eine Instanz SqlCommand zurückgeben (es gibt andere Unterklassen von DbCommand, die Sie nicht verwenden möchten). Vergewissern Sie sich, dass die AddInParameter() der Collection Parameters eine Instanz SqlParameter hinzufügt, dass die DbType-Eigenschaft DbType.DateTime lautet und die Value-Eigenschaft vom Typ System.DateTime ist.

Sobald Parameter ordnungsgemäß zu einem SqlCommand hinzugefügt wurden, sollte es gut mit MSSQL gespeicherten Prozeduren arbeiten, auch mit DateTime-Daten (es hat für mich, zig Millionen von Mal).

0

Ich bin gerade auf dasselbe gestoßen - es stellt sich heraus, dass die beiden einfachen Anführungszeichen nur im Profiler auftauchen. Der zugrundeliegende (tatsächliche) Fehler war, dass ich zu viele Argumente an die gespeicherte Prozedur übergab.