我正在尝试使用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中。
答案 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";
希望这可以使您从数据库中提取数据或插入数据库中快速入门。