C# 更新SQL Server中的表时出错:将字符串转换为smalldatetime数据类型时转换失败

C# 更新SQL Server中的表时出错:将字符串转换为smalldatetime数据类型时转换失败,c#,.net,sql-server,C#,.net,Sql Server,在C#中,我想编写一个包含smalldatetime列的更新查询,我看到过几篇关于Stackoverflow的文章,但没有找到一篇可以解决此错误的文章: 将字符串转换为smalldatetime数据类型时,转换失败 我有一个表RESERVAS,有3列ID\u RESERVA(int),LLEGADA(smalldatetime),SALIDA(smalldatetime) 守则: string strQuery = "UPDATE " + DB_TABLENAME + " SET " +

在C#中,我想编写一个包含
smalldatetime
列的更新查询,我看到过几篇关于Stackoverflow的文章,但没有找到一篇可以解决此错误的文章:

将字符串转换为smalldatetime数据类型时,转换失败

我有一个表
RESERVAS
,有3列
ID\u RESERVA
int
),
LLEGADA
smalldatetime
),
SALIDA
smalldatetime

守则:

 string strQuery = "UPDATE " + DB_TABLENAME + "  SET " +
 "LLEGADA = CONVERT(smalldatetime, '@LLEGADA', 126), " +
 "SALIDA = CONVERT(smalldatetime, '@SALIDA', 126) " +
 "WHERE ID_RESERVA = @ID_RESERVA";

 SqlCommand cmd = new SqlCommand(strQuery, con); // con = SqlConnection
 cmd.Parameters.Add("@ID_RESERVA", SqlDbType.Int);
 cmd.Parameters.Add("@LLEGADA", SqlDbType.SmallDateTime);
 cmd.Parameters.Add("@SALIDA", SqlDbType.SmallDateTime);

 cmd.Parameters["@ID_RESERVA"].Value = Convert.ToInt32(stringWithIdReserva);
 cmd.Parameters["@LLEGADA"].Value = stringWithLLegada.Replace(" ", "T"); //Real string value: "2015-03-30 00:00:00"
 cmd.Parameters["@SALIDA"].Value = stringWithSalida.InnerText.Replace(" ", "T"); //Real string value: "2015-04-01 00:00:00"

  try
  {
      cmd.ExecuteNonQuery();
  }
  catch (SqlException ex)
  {
      Console.WriteLine(ex.Message);
  }

这是因为您已经用单记号标记了参数。它的编码方式是尝试解析字符串文本,而不是参数中的值

string strQuery = "UPDATE " + DB_TABLENAME + "  SET " +
 "LLEGADA = CONVERT(smalldatetime, @LLEGADA, 126), " +
 "SALIDA = CONVERT(smalldatetime, @SALIDA, 126) " +
 "WHERE ID_RESERVA = @ID_RESERVA";

 SqlCommand cmd = new SqlCommand(strQuery, con); // con = SqlConnection
 cmd.Parameters.Add("@ID_RESERVA", SqlDbType.Int);
 cmd.Parameters.Add("@LLEGADA", SqlDbType.SmallDateTime);
 cmd.Parameters.Add("@SALIDA", SqlDbType.SmallDateTime);

 cmd.Parameters["@ID_RESERVA"].Value = Convert.ToInt32(stringWithIdReserva);
 cmd.Parameters["@LLEGADA"].Value = stringWithLLegada.Replace(" ", "T"); //Real string value: "2015-03-30 00:00:00"
 cmd.Parameters["@SALIDA"].Value = stringWithSalida.InnerText.Replace(" ", "T"); //Real string value: "2015-04-01 00:00:00"

  try
  {
      cmd.ExecuteNonQuery();
  }
  catch (SqlException ex)
  {
      Console.WriteLine(ex.Message);
  }

这是因为您已经用单记号标记了参数。它的编码方式是尝试解析字符串文本,而不是参数中的值

string strQuery = "UPDATE " + DB_TABLENAME + "  SET " +
 "LLEGADA = CONVERT(smalldatetime, @LLEGADA, 126), " +
 "SALIDA = CONVERT(smalldatetime, @SALIDA, 126) " +
 "WHERE ID_RESERVA = @ID_RESERVA";

 SqlCommand cmd = new SqlCommand(strQuery, con); // con = SqlConnection
 cmd.Parameters.Add("@ID_RESERVA", SqlDbType.Int);
 cmd.Parameters.Add("@LLEGADA", SqlDbType.SmallDateTime);
 cmd.Parameters.Add("@SALIDA", SqlDbType.SmallDateTime);

 cmd.Parameters["@ID_RESERVA"].Value = Convert.ToInt32(stringWithIdReserva);
 cmd.Parameters["@LLEGADA"].Value = stringWithLLegada.Replace(" ", "T"); //Real string value: "2015-03-30 00:00:00"
 cmd.Parameters["@SALIDA"].Value = stringWithSalida.InnerText.Replace(" ", "T"); //Real string value: "2015-04-01 00:00:00"

  try
  {
      cmd.ExecuteNonQuery();
  }
  catch (SqlException ex)
  {
      Console.WriteLine(ex.Message);
  }

就是那个:)。单记号,我喜欢!比撇号更好的名字;)单引号是的,好多了。对于美国开发者来说,这是一个更好的参考术语。所以,我必须删除所有类型参数中的单个勾号,还是只删除日期和数字?是的。如果您在原始帖子中有单引号,那么它不是使用参数,而是使用字符串文字。就像在t-sql中的其他地方一样,字符串用单引号括起来。单记号,我喜欢!比撇号更好的名字;)单引号是的,好多了。对于美国开发者来说,这是一个更好的参考术语。所以,我必须删除所有类型参数中的单个勾号,还是只删除日期和数字?是的。如果您在原始帖子中有单引号,那么它不是使用参数,而是使用字符串文字。就像t-sql中的其他地方一样,字符串用单引号包装。