如何在C#中进行参数化的SELECT查询?

时间:2019-05-04 00:13:27

标签: c# sql-server select query-parameters

我正在尝试使用DataGridView和C#和SQL Server中的参数化查询显示数据库中表中的数据。

到目前为止,我已经尝试了以下代码:

private void button1_Click(object sender, EventArgs e)
{
        SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS01;Initial Catalog=Vagtplan;Integrated Security=True");

        SqlCommand cmd = new SqlCommand("SELECT Ansatte.ansatID = @ansat, Ansatte.Navn = @navn, Ansatte.Efternavn = @efternavn, Ansatte.Adresse = @adresse, Ansatte.Postnummer = @postnummer, Ansatte.Bynavn = @bynavn, Ansatte.Email = @email, Ansatte.Mobilnr = @mobilnr, Login_data.Brugertype = @brugertype FROM Ansatte INNER JOIN Login_data ON Ansatte.ansatID = Login_data.ansatID", con);

        cmd.Parameters.Add("@ansat", SqlDbType.Int);
        cmd.Parameters.Add("@navn", SqlDbType.VarChar);
        cmd.Parameters.Add("@eftervavn", SqlDbType.VarChar);
        cmd.Parameters.Add("@adresse", SqlDbType.VarChar);
        cmd.Parameters.Add("@postnummer", SqlDbType.Int);
        cmd.Parameters.Add("@bynavn", SqlDbType.VarChar);
        cmd.Parameters.Add("@email", SqlDbType.VarChar);
        cmd.Parameters.Add("@mobilnr", SqlDbType.Int);
        cmd.Parameters.Add("@brugertype", SqlDbType.VarChar);

        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        sda.Fill(dt);

        dataGridView2.DataSource = dt;
    }

但是出现以下错误:

  

'='附近的语法不正确

如何解决它,以便可以使用参数化查询选择数据?预期结果是,该数据将显示在DataGridView中。

1 个答案:

答案 0 :(得分:1)

您正在这里进行一些操作,我将尽力为您分解。使用数据库时,通常需要执行“从...中选择...”来获取数据,然后进行“插入...中”来向表中添加记录。

接下来,您的查询。简短的版本。.问题是您试图将@ansat PARAMETER值分配到Ansatte.ansatID字段中,该字段一开始是不正确的语法上下文,但是请务必进行检查。

SqlCommand cmd = new SqlCommand(
@"SELECT 
      Ansatte.ansatID = @ansat, 
      Ansatte.Navn = @navn, 
      Ansatte.Efternavn = @efternavn, 
      Ansatte.Adresse = @adresse...
   FROM 
      Ansatte 
         INNER JOIN Login_data 
            ON Ansatte.ansatID = Login_data.ansatID", con);

然后添加参数...

cmd.Parameters.Add("@ansat", SqlDbType.Int);
cmd.Parameters.Add("@navn", SqlDbType.VarChar);
cmd.Parameters.Add("@eftervavn", SqlDbType.VarChar);
cmd.Parameters.Add("@adresse", SqlDbType.VarChar);

很好,您正在使用参数,但是您只是对参数进行了声明,您从未为它们分配任何实际值,从本质上讲,这导致将以下内容传递给引擎

SELECT 
      Ansatte.ansatID = , 
      Ansatte.Navn = , 
      Ansatte.Efternavn = , 
      Ansatte.Adresse = 
   FROM 
      Ansatte 
         INNER JOIN Login_data 
            ON Ansatte.ansatID = Login_data.ansatID

因此,可能是您的错误,因为=号没有值。现在,要在参数中实际添加“值” ...您的声明就可以了,只需在窗口项,配置设置等任何内容中添加一个可以是固定值的值即可。

cmd.Parameters.Add("@ansat", SqlDbType.Int).Value = 123;
cmd.Parameters.Add("@navn", SqlDbType.VarChar).Value = "test";
cmd.Parameters.Add("@eftervavn", SqlDbType.VarChar).Value = "more";
cmd.Parameters.Add("@adresse", SqlDbType.VarChar).Value = "done";

这将导致受保护的(非sql注入)

现在,您可能真正想要的是什么。您的数据库中有一个要从中提取信息的表。在这种情况下,请选择想要的列,而不要选择要设置的值。只是查询。例如:

SqlCommand cmd = new SqlCommand(
@"SELECT 
      Ansatte.ansatID, 
      Ansatte.Navn, 
      Ansatte.Efternavn, 
      Ansatte.Adresse, 
      Ansatte.Postnummer, 
      Ansatte.Bynavn, 
      Ansatte.Email, 
      Ansatte.Mobilnr, 
      Login_data.Brugertype
   FROM 
      Ansatte 
         INNER JOIN Login_data 
            ON Ansatte.ansatID = Login_data.ansatID", con);

如果运行上述查询,它将返回数据库中所有在每个表之间具有匹配ID的记录。

现在,将参数附加到SQL-SELECT查询。假设您只想要给定PostNumber区域内的所有名称。为此类字段和参数化值(例如

)添加WHERE条件
   FROM 
      Ansatte 
         INNER JOIN Login_data 
            ON Ansatte.ansatID = Login_data.ansatID
   where
      Ansatte.Postnummer = @MyPostCriteria", con );


cmd.Parameters.Add("@postnummer", SqlDbType.Int).Value = 11223;

现在,如果您想将记录添加到数据库中,那将是一个插入,并且一次只能将插入一次插入单个表中,可能类似于以下内容。您先确定要插入的表和列,然后确定与顶部括号列表中添加的相应序列相同的序列中的值。然后进行参数化

SqlCommand cmd = new SqlCommand(
@"INSERT INTO Ansatte
   ( Navn,
     Efternavn,
     Adresse
   )
   values
   ( @parmForNavn,
     @parmForEfternavn,
     @parmForAdresse
   )", con);


    cmd.Parameters.Add("@navn", SqlDbType.VarChar).Value = "test";
    cmd.Parameters.Add("@eftervavn", SqlDbType.VarChar).Value = "blah";
    cmd.Parameters.Add("@adresse", SqlDbType.VarChar).Value = "123 some street";

希望这可以使您从数据库中提取数据或插入数据库中快速入门。