我在Windows服务器上有一个C#webservice,我在一台带有PHP的Linux服务器上连接。 PHP从数据库中获取信息,然后页面提供“更多信息”按钮,然后调用Web服务并将记录的名称字段作为参数传递。所以我在查询中使用WHERE语句,所以我只拉取该记录的额外字段。我收到了错误:
System.Data.SqlClient.SqlException:无效的列名称'42'
其中42是数据库中名称字段的值。
我的查询是
string selectStr = "SELECT name, castNotes, triviaNotes FROM tableName WHERE name =\"" + show + "\"";
我不知道我的查询是否有问题,或者数据库出了什么问题,但这是我的其余代码供参考。
注意:当我抓住所有记录时,这一切都很完美,但我只想抓住我要求我的网络服务的记录。
public class ktvService : System.Web.Services.WebService {
[WebMethod]
public string moreInfo(string show) {
string connectionStr = "MyConnectionString";
string selectStr = "SELECT name, castNotes, triviaNotes FROM tableName WHERE name =\"" + show + "\"";
SqlConnection conn = new SqlConnection(connectionStr);
SqlDataAdapter da = new SqlDataAdapter(selectStr, conn);
DataSet ds = new DataSet();
da.Fill(ds, "tableName");
DataTable dt = ds.Tables["tableName"];
DataRow theShow = dt.Rows[0];
string response = "Name: " + theShow["name"].ToString() + "Cast: " + theShow["castNotes"].ToString() + " Trivia: " + theShow["triviaNotes"].ToString();
return response;
}
}
答案 0 :(得分:4)
我相信您需要selectStr
中的单引号:
string selectStr =
"SELECT name, castNotes, triviaNotes FROM tableName WHERE name = '" + show + "'";
在.NET中,您需要确保在不再需要时明确关闭任何连接。最简单的方法是在实现using
的任何类型周围包装IDisposable
语句,例如SqlConnection
:
using(SqlConnection conn = new SqlConnection(connectionStr))
{
SqlDataAdapter da = new SqlDataAdapter(selectStr, conn);
DataSet ds = new DataSet();
da.Fill(ds, "tableName");
DataTable dt = ds.Tables["tableName"];
DataRow theShow = dt.Rows[0];
string response = "Name: " + theShow["name"].ToString() + "Cast: " + theShow["castNotes"].ToString() + " Trivia: " + theShow["triviaNotes"].ToString();
return response;
}
此外,您的代码看起来很容易受到SQL注入的影响。如果有人提交的表格值为fake name' OR 1=1;DROP DATABASE someDbName;--
?
您需要利用SQL参数,例如:
SqlCommand cmd = new SqlCommand(
"SELECT name, castNotes, triviaNotes FROM tableName WHERE name = @show", conn);
cmd.Parameters.AddWithValue("@show", show);
答案 1 :(得分:1)
WHERE子句不应该是WHERE name = '" + show + "'";
字符串应该用单引号括起来,而不是SQL语句的双引号。
System.Data.SqlClient namespace也适用于SQL Server而不是MySQL。有关通过C#连接MySQL的信息,请参阅MySQL official docs。