SqlDataReader 参数不起作用

Posted

技术标签:

【中文标题】SqlDataReader 参数不起作用【英文标题】:SqlDataReader parameter not working 【发布时间】:2012-11-18 20:03:44 【问题描述】:

我有一个 Windows 窗体,我要求用户在 textbox1 中输入 pcname,然后尝试使用SqlDataReader 从数据库中读取以获取 pc ipaddress,然后将 pc 驱动器映射到我的本地 pc。

但由于某种原因,当我在 SQL 参数中使用文本框时,它不起作用。但是当我用实际的 pcname 替换 textbox1.text 时,它工作正常。希望有人可以帮助我找出参数无法正常工作的原因。

这是我的代码:

public void button1_Click(object sender, EventArgs e)

    string results = "";

    using (SqlConnection cs = new SqlConnection(@"***removed connection string***"))
    
        cs.Open();

        string query = "select stationipaddress from station where stationname = @StationName";

        using (SqlCommand cmd = new SqlCommand(query, cs))
        
            // Add the parameter and set its value -- 
            cmd.Parameters.AddWithValue("@StationName", textBox1.Text);

            using (SqlDataReader dr = cmd.ExecuteReader())
            
                while (dr.Read())
                
                    label3.Text = dr.GetSqlValue(0).ToString();
                    results = dr.GetValue(0).ToString();
                    MessageBox.Show(dr.GetValue(0).ToString());
                    MessageBox.Show(results);
                

                string myvar = string.Format(@"use S: \\" + label3.Text + "\\c$\logs 0A36303 /user:admin", label3.Text);

                Process p = new Process();
                p.StartInfo.FileName = "net.exe";
                p.StartInfo.Arguments = (myvar);
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.CreateNoWindow = true;
                p.Start();

【问题讨论】:

请学习正确格式化您的问题。这表明花费了几分钟的努力。 去掉“@StationName”周围的单引号。有了它们,它就变成了字符串文字 @StationName 而不是参数。 除了单引号之外,正如 Conrad Frix 所说,您可以用简单的 'SqlDataReader reader = cmd.ExecuteReader()' 替换 using(SqlDataReader) 以摆脱内部使用。 这表明它没有返回任何行。 否,因为如果没有返回任何行,dr.Read() 将永远不会返回 true,并且您的代码将永远不会进入 while 循环。 【参考方案1】:

也许如果你把你的代码分开在不同的行,一个用来设置你的参数,一个用来添加它,你可以更好地看到问题出在哪里。 像这样的:

SqlParameter param1 = new SqlParameter("@StationName", SqlDbType.NVarChar, textBox1.Text.length);
param1.Value = textBox1.Text;
cmd.Parameters.Add(param1);

至少更容易看到调试器上发生了什么。

【讨论】:

当我像这样将站名放入查询中时:'站名'它可以工作但不带参数,这与它有关吗? 使用 mssql 时,您在 sql 语句中使用单引号来表示字符串。在 c# 中,单引号表示 char 类型而不是字符串。

以上是关于SqlDataReader 参数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 SqlTransaction 与 SqlDataReader 一起使用

如何从 SqlDataReader 获取列的表名

为啥模板参数推导在 C++ 中不起作用?

为啥高度参数在标签小部件中不起作用?

为啥这个带参数的 sqlsrv 查询不起作用?

卷曲参数数组不起作用