【问题标题】:Conversion failed when converting the varchar value转换 varchar 值时转换失败
【发布时间】:2013-02-18 10:51:54
【问题描述】:

当我尝试运行它时,它给了我以下错误消息:

将 varchar 值 'category_id' 转换为数据类型 int 时转换失败。

这是我的 SQL 和参数代码,我认为它应该可以工作,但它没有。

mycmd.CommandText="SELECT * FROM categories WHERE @db_property = @property_id"; 

// This contains a string "category_id", which is correct.
mycmd.Parameters.Add("@db_property", SqlDbType.VarChar).Value=db_property_field; 

// This contains an Int, referring to the category_id in database. As of now, this is 1
mycmd.Parameters.Add("@property_id", SqlDbType.Int).Value=property_id; 

浏览完这段代码后,我通过阅读器运行它,这就是我收到上述错误消息的地方。一直问老师,还有我班的优秀学生,没人能找到线索,问题出在哪里。

【问题讨论】:

  • 嗯,它正在尝试将文字字符串category_id 转换为整数值,这当然会失败。你能把相关代码贴在实际发生错误的那一行吗?
  • 它在我的阅读器执行行运行时发生。
  • db_property_field 是否包含“1”?
  • 它不是试图将1 转换为int,而是 category_id(作为varchar)。我认为 Denys 的回答应该可以解决您的问题。

标签: c# sql parameters error-handling type-conversion


【解决方案1】:

您不应添加字段名称作为参数。尝试更改您的脚本以包含实际的字段 ID:

mycmd.CommandText = "SELECT * FROM categories WHERE category_id = @property_id";
mycmd.Parameters.Add("@property_id", SqlDbType.Int).Value = property_id;

【讨论】:

  • 我想要做的是做一个灵活的方法,做 SQL 查询,而不是每次都做一个新的查询,我想从我的数据库中选择一些东西。这就是我使用字段名称作为参数的原因,理论上应该可以。
  • 正确。第一个参数被解析为文字字符串。
  • @KevinJensenPetersen 尝试用方括号 ([FieldName]) 将字段名称括起来,这样可能会起作用。
  • 第一个参数是一个字符串yes,我将其传递到查询中以在我的WHERE 中进行测试。我该怎么解决?
  • 我不知道这是否符合您的需求,但您可以尝试在“where”子句中设置您的名字,并将参数设置为实际值。这将使您无法对每个案例进行新的查询。
【解决方案2】:

我不确定您的结构,但请尝试以下操作:

mycmd.CommandText = "SELECT * FROM categories WHERE Cast(@db_property as Int) = @property_id";

【讨论】:

    【解决方案3】:

    您的查询与您传入的两个变量匹配,因此它要么返回所有数据,要么不返回任何数据!最重要的是,您将 char 变量与 int 匹配。 SQL 将尝试将 char 变量转换为 int。

    @db_property = @property_id
    

    您的查询应该是这样的吗?

    SELECT * FROM categories WHERE db_property = @db_property AND property_id = @property_id
    

    【讨论】:

    • 我对查询的实际计划是让它看起来像 .. WHERE 'category_id' = 1
    【解决方案4】:

    如果您查看您的陈述,您正在比较两个参数。 WHERE 子句不在表列(“类别”)上,您传递的两个参数是不同的数据类型。 VarChar 和 Int。当执行该命令时,SQL 引擎会尝试比较两个不同数据类型的变量。

    如果您直接针对 SQL 运行以下 SQL 语句,您将收到相同的错误。

    DECLARE @Var1 VARCHAR(100)
    DECLARE @Var2 INT
    
    SELECT @Var1 = 'Test', @Var2 = 1
    
    SELECT * FROM dbo.categories  WHERE @Var1 = @Var2
    

    【讨论】:

      【解决方案5】:

      您可以从以下地址获得解决方案:

      http://net-informations.com/csprj/data-providers/cs-procedure-parameter.htm

      为了您的信息,我只是重塑代码并根据我的需要使用它。

      存储过程代码如下:

      Create PROCEDURE [dbo].[PmSPValidate]
      @a varchar(10)
      
      AS
      BEGIN
      (SELECT AcctDsc,AcctAge 
      FROM dbo.tblCoa 
      WHERE AcctNo >= @a)
      
      END
      
      Code of C# :
      
       private void btnThirdTrial_Click(object sender, EventArgs e)
              {
                  string connetionString = null;
                  SqlConnection connection;
                  SqlDataAdapter adapter;
                  SqlCommand command = new SqlCommand();
                  SqlParameter param;
                  DataSet ds = new DataSet();
      
                  int i = 0;
      
                  connetionString = "Data Source=FIN03;Initial Catalog=CmsTest;Integrated Security=True";
      
                  connection = new SqlConnection(connetionString);
      
                  connection.Open();
                  command.Connection = connection;
                  command.CommandType = CommandType.StoredProcedure;
                  command.CommandText = "dbo.PmSPValidate";
      
                  param = new SqlParameter("@a",Account.Text.ToString ());
                  param.Direction = ParameterDirection.Input;
                  param.DbType = DbType.String;
                  command.Parameters.Add(param);
      
                  adapter = new SqlDataAdapter(command);
                  adapter.Fill(ds);
      
                  for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
                  {
                      MessageBox.Show(" Name " + ds.Tables[0].Rows[i][0].ToString() + "  Age " + ds.Tables[0].Rows[i][1].ToString());
      
                  }
      
                  connection.Close();
      
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 2023-03-31
        • 2011-05-01
        • 1970-01-01
        相关资源
        最近更新 更多