WHERE columnName的问题= C#中MySQL查询中的数据

时间:2010-05-04 02:21:07

标签: c# mysql

我在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;

} 

}

2 个答案:

答案 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