转换varchar值时,转换失败

本文关键字:转换 失败 值时 varchar | 更新日期: 2023-09-27 18:02:10

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

将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; 

在我遍历了这段代码之后,我在Reader中运行它,这就是我得到上面错误消息的地方。一直问老师,和我班上优秀的同学,谁也找不到一点线索,问题出在哪里。

转换varchar值时,转换失败

不应该添加字段名作为参数。试着修改你的脚本以包含实际的字段id:

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

我不确定你的结构,但尝试以下:

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

您的查询匹配您正在传递的两个变量,因此它将返回所有数据或不返回数据!最重要的是,你将一个char变量与一个int变量进行匹配。SQL将尝试将char变量强制转换为int类型。

@db_property = @property_id

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

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

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

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

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

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

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();
        }