C# 运行SQL Server查询时发生C异常错误
我正在构建简单的库应用程序。我正在使用C和SQL Server 2017 当运行一个函数来检查这本书是否已经存在时,我在名字附近发现了一个错误C# 运行SQL Server查询时发生C异常错误,c#,sql-server,C#,Sql Server,我正在构建简单的库应用程序。我正在使用C和SQL Server 2017 当运行一个函数来检查这本书是否已经存在时,我在名字附近发现了一个错误 public bool DoesItExist() { mainSet mset = new mainSet(); string query = "SELECT * FROM [Library].[dbo].[ViewBook] WHERE " +
public bool DoesItExist()
{
mainSet mset = new mainSet();
string query = "SELECT * FROM [Library].[dbo].[ViewBook] WHERE " +
"Title = '" + this.title + "' AND " +
"DateOfFirstRelease = " + this.release_date + " AND " +
"Name = '" + this.author_name + "' AND " +
"2Name= '" + this.author_2name + "' AND " +
"Surname = '" + this.author_surname + "' AND " +
"Category = '" + this.category + "' AND " +
"Publishing = '" + this.Publishing+ "' ";
SqlConnection cnn = new SqlConnection(mset.dataBaseConect);
SqlCommand cmd = new SqlCommand(query, cnn);
cnn.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows) return true;
else return false;
}
所有这些。是标题类中的参数
除DateOfRelease类型为:int外,所有参数的类型均为:string
[ViewBook]是[Library]数据库中的一个视图
我得到的错误是:
System.Data.SqlClient.SqlException:
An expression of non-boolean type specified in a context where a condition is expected, near 'Name'.”
cmd查询的示例:
"SELECT * FROM [Library].[dbo].[ViewBook] WHERE Title = 'Book Name' AND DateOfFirstRelease = 2004 AND Name = 'George' AND 2Name= '' AND Surname = 'Martin' AND Category = 'Economy' AND Publishing = 'PublishingTest' "
这个答案有一个很大的警告;我不是c程序员,所以我没有测试过这个。我很少接近C,只有当我这样做的时候,因为我是一名DBA/SQL开发人员,所以我在帮助我们的开发人员满足他们的SQL Server需求。但是我做了什么?我使用了文档&为了编写一个正确的参数化查询,我添加了一条注释,解释为什么我认为您的查询也失败了:
string query = "SELECT * FROM Library.dbo.ViewBook" +
" WHERE Title = @Title" +
" AND DateOfFirstRelease = @ReleaseDate" +
" AND [Name] = @AuthorName" + //Name is a keyword, so I prefer to quote it
" AND [2Name] = @AuthorName2" + //Quoted as a column that begins with a number needs to be delimit identified
" AND Surname = @Surname" +
" AND Category = @Category" +
" AND Publishing = @Publishing;";
using (SqlConnection cnn = new SqlConnection(mset.dataBaseConect))
{
SqlCommand cmd = new SqlCommand(query, cnn);
cmd.Parameters.Add("@Title",SqlDbType,VarChar,50); //Guessed datatype
cmd.Parameters["@Title"].Value = this.title;
cmd.Parameters.Add("@ReleaseDate",SqlDbType.Date); //Guessed datatype
cmd.Parameters["@ReleaseDate"].Value = this.release_date;
cmd.Parameters.Add("@AuthorName",SqlDbType.VarChar,50); //Guessed datatype
cmd.Parameters["@AuthorName"].Value = this.author_name;
cmd.Parameters.Add("@AuthorName2",SqlDbType.VarChar,50); //Guessed datatype
cmd.Parameters["@AuthorName2"].Value = this.author_2name;
cmd.Parameters.Add("@Surname",SqlDbType.VarChar,50); //Guessed datatype
cmd.Parameters["@Surname"].Value = this.author_surname;
cmd.Parameters.Add("@Category",SqlDbType.VarChar,50); //Guessed datatype
cmd.Parameters["@Category"].Value = this.category;
cmd.Parameters.Add("@Publishing",SqlDbType.VarChar,50); //Guessed datatype
cmd.Parameters["@Publishing"].Value = this.Publishing;
cnn.Open();
SqlDataReader reader = cmd.ExecuteReader();
}
不要注入你的值,参数化它们!SQL注入不是你的朋友。我真的同意@Larnu!请使用参数。添加它们的方法可以在学校项目中看到。。我明白这怎么能给你不这么做的理由。然而,如果你做了这么糟糕的事情,那总是错的。如果这成为一种习惯,你将面临巨大的问题。最好总是做得至少是好的!我知道。这只是一个简单的学校项目,所以不要因为那种态度而烦恼,那样会让你的成绩很差,如果你继续在工作场所使用它,会有很多麻烦。现在就学习如何做事,不要偷懒。参数化是答案的一部分。我刚刚注意到@Steve。我更习惯于使用T-SQL来构建动态语句和使用NCHAR13+NCHAR10:忘记名称上的[]。添加它们之后,所有这些都可以工作。谢谢但是你把你的问题参数化了吗,@DonSlipo?@DonSlipo那么你完全忽略了我回答的全部要点。。。现在停止犯这些错误,解决真正的问题。