SQL помещает две одинарные кавычки вокруг полей даты и времени и не может вставить запись - PullRequest
2 голосов
/ 23 апреля 2009

Я пытаюсь вставить таблицу базы данных SQL, но она не работает. Поэтому я использовал профилировщик SQL-сервера, чтобы посмотреть, как он строит запрос; он показывает следующее:

declare @p1 int
set @p1=0
declare @p2 int
set @p2=0
declare @p3 int
set @p3=1
exec InsertProcedureName @ConsumerMovingDetailID=@p1 output, @UniqueID=@p2 output, 
                         @ServiceID=@p3 output, @ProjectID=N'0', @IPAddress=N'66.229.112.168', 
                         @FirstName=N'Mike', @LastName=N'P', @Email=N'mymail@yahoo.com', 
                         @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

Как видите, он помещает двойные кавычки две пары одинарных кавычек вокруг полей даты и времени, так что он вызывает синтаксическую ошибку в SQL. Интересно, есть ли что-то, что я должен где-то настроить?

Любая помощь будет оценена.

Вот детали среды:

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

Вот код .NET, который я использую ....

//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" });

Ответы [ 6 ]

3 голосов
/ 23 апреля 2009

Я подозреваю, что вы добавляете одинарные кавычки в поле даты и времени и отправляете его в виде строки? Не делай этого. Используйте параметр datetime для параметра и не добавляйте к нему кавычки.

Было бы полезно, если бы вы показали нам .Net сторону кода.

1 голос
/ 26 ноября 2009

SP2 или SP3 должны решить эту проблему в Profiler

0 голосов
/ 09 июня 2010

Я только что столкнулся с тем же самым - оказывается, что две одинарные кавычки были показаны только в профилировщике. Основной (фактической) ошибкой было то, что я передавал слишком много аргументов хранимой процедуре.

0 голосов
/ 26 ноября 2009

Я бы искал проблему в вашем классе Базы данных. Возможно, метод AddInParameter() выполняет некоторые jiggery-pokery с параметрами DateTime, такие как добавление отформатированной строки или что-то глупое в этом роде.

Для использования с MSSQL CreateStoredProc() обязательно должен возвращать экземпляр SqlCommand (есть другие подклассы DbCommand, которые вы не хотите использовать). Убедитесь, что AddInParameter() добавляет экземпляр SqlParameter в коллекцию параметров, что его свойство DbType равно DbType.DateTime, а свойство Value имеет тип System.DateTime.

После правильного добавления параметров в SqlCommand он должен хорошо работать с хранимыми процедурами MSSQL, а также с данными DateTime (для меня это происходит миллионы раз).

0 голосов
/ 25 апреля 2009

Является ли objPropConsumer.MoveDate строкой? Похоже, что он заполнен строкой с апострофами в начале и в конце. Попробуйте заменить objPropConsumer.MoveDate константой «2009-04-30 00:00:00» и посмотрите, работает ли это. Если это так, проблема заключается в том, где MoveDate установлен или преобразован.

0 голосов
/ 23 апреля 2009

Попробуйте это:

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

Обратите внимание на одинарные кавычки и "." вместо ":" за миллисекунды. Или попробуйте это:

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

Чтобы убедиться, что это не миллисекунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...