У меня есть динамический запрос c, и я пытаюсь выполнить его, используя sp_execute sql. В динамическом запросе c у меня есть поле типа datetime. Это поле передается как параметр из C#. NET в хранимую процедуру на SQL Server. Я вызываю этот sp из C#, используя типичные команды:
public static object ExecuteProcedure(int userId, DbConnection con, DbTransaction trans, string procedureName, bool withLog, params MyCustomParameter[] parameters)
{
if (con.State != ConnectionState.Open)
con.Open();
bool bMyTransaction = trans == null;
if (trans == null)
trans = con.BeginTransaction();
try
{
MyLog log = withLog ? MyLog.FromProcedure(trans, procedureName, parameters) : null;
DbCommand command = con.CreateCommand();
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = procedureName;
command.Transaction = trans;
command.AddMyCustomParameters(parameters);
int result = command.ExecuteNonQuery();
if (log != null)
log.SaveLogData();
if (bMyTransaction == true)
trans.Commit();
return result;
}
catch (Exception ex)
{
if (bMyTransaction == true)
trans.Rollback();
return null;
}
}
Выдает исключение в строке:
int result = command.ExecuteNonQuery();
Выдается ошибка (перевод с испанского sh ):
Ошибка преобразования строки символов в дату и / или время.
Хранимая процедура выглядит примерно так:
CREATE PROCEDURE [dbo].[spLogger]
@Id varchar(100),
@Param1 varchar(100),
@Param2 varchar(15),
@Param3 int,
@DateTimeField datetime,
@Param4 varchar(100),
@TargetTable tinyint = 0
AS
BEGIN
DECLARE @sqlCommand nvarchar(max)
DECLARE @tblName nvarchar(100)
SET @tblName = CASE @TargetTable
WHEN 0 THEN '[dbo].[LogTable_01]'
WHEN 1 THEN '[dbo].[LogTable_02]'
WHEN 2 THEN '[dbo].[LogTable_03]'
ELSE ''
END
IF @tblName <> ''
BEGIN
SET @sqlCommand =
'INSERT INTO ' + @tblName +
'([Id] ' +
',[Param1] ' +
',[Param2] ' +
',[Param3] ' +
',[MyDateTimeField] ' +
',[Param4]) ' +
'VALUES' +
'(''' + @Id + ''',''' + @Param1 + ''',''' + @Param2 + ''',' + CAST(@Param3 AS VARCHAR(10)) + ',' + @DateTimeField + ',''' + @Param4 + ''')'
EXECUTE sp_executesql @sqlCommand
END
END
Параметр @DateTimeField передается из C# и имеет тип DateTime. Значение, переданное для этого параметра, выглядит следующим образом:
27/02/2020 18: 05: 05
В таблице MyDateTimeField определяется как datetime.
Так как я могу объединить поле datetime в T- SQL со строкой?
Также, как вы можете видеть, я объединяю тип INT, параметр @ Param3, я также хотел бы знать если я конкатенирую также хорошо.