'='附近的语法不正确

时间:2013-05-03 03:42:24

标签: c# asp.net

我写过这个剧本,但由于某些原因,它给了我一些错误,我不明白为什么

这就是我所拥有的:

   conn.Open();
    int maxRow = Int32.Parse(cmd.ExecuteScalar().ToString());

    sSql = "select * from P_MKZGood";
    if (flag == true)
    {
        sSql += "where IsCommend = 1";
    }
    cmd.CommandText = sSql;
    SqlDataReader reader = cmd.ExecuteReader();

    ArrayList gInfos = new ArrayList();
    GoodsInfo gInfo;

    for (int i = 0; i < maxRow; i++)
    {
        if (reader.Read())
        {
            gInfo = new GoodsInfo();

错误=

  

[SqlException(0x80131904):'='附近的语法不正确。]

    int maxRow = Int32.Parse(cmd.ExecuteScalar().ToString());

那部分有什么问题?谢谢!

现在修复了,谢谢你们,我对这个错误感觉多么愚蠢;)

5 个答案:

答案 0 :(得分:6)

您的SQL字符串需要P_MKZGoodwhere之间的空格。

答案 1 :(得分:2)

好的,你添加了一个asp.net错误的图片,它显示了你得到SqlException的行号:

int maxRow = Int32.Parse(cmd.ExecuteScalar().ToString());

此时cmd.CommandText的值是什么(我无法分辨,因为您没有在此行上方包含代码),很可能有一个类似于代码中的t-sql语法错误我在下面提到过:

尝试在表名后添加空格:

sSql = "select * from P_MKZGood ";

使用当前代码,如果flag设置为true,那么您将创建以下t-sql命令文本:

  

从P_MKZGoodwhere IsCommend = 1

中选择*

请注意 P_MKZGood 之间没有空格。这是一种语法违规,导致抛出SqlException。

答案 2 :(得分:0)

@SLaks和@Phage已经确切地指出了你的问题,但我想加上自己的两分钱。如果您在cmd.CommandText = sSql;行上设置断点,那么当sSql等于flag == true时,您会看到select * from P_MKZGoodwhere IsCommend = 1。 (也就是说,P_MKZGoodwhere之间没有空格。)

您需要的是select * from P_MKZGood where IsCommend = 1。我建议在

的开头添加一个空格
sSql += "where IsCommend = 1";

所以它恰好是

sSql += " where IsCommend = 1";

答案 3 :(得分:0)

基于您之前和此问题,我认为您需要以下方法。正如其他人所提到的,你可以在编码中改进许多错误和地方。检查以下代码。

public List<GoodsInfo> GetGoodsList(bool flag)
{
    List<GoodsInfo> gInfos = new List<GoodsInfo>();
    using (SqlConnection sConn = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["Conn"].ToString()))
    {
        sConn.Open();
        using (SqlCommand sCmd = new SqlCommand())
        {
            sCmd.Connection = sConn;
            sCmd.CommandText = "select * from P_MKZGood" + (flag ? " where IsCommend = 1" : string.Empty); 

            using (SqlDataReader sqlReader = sCmd.ExecuteReader())
            {
                while (sqlReader.Read())
                {
                    GoodsInfo gInfo = new GoodsInfo();
                    gInfo.G_ID = Int32.Parse(sqlReader["G_ID"].ToString());
                    gInfo.G_Name = sqlReader["G_Name"].ToString();
                    gInfo.Type = sqlReader["Type"].ToString();
                    gInfo.GoodsType = sqlReader["GoodsType"].ToString();
                    gInfos.Add(gInfo);
                }
            }
        }
    }
    return gInfos;
}

几点:

  • 最好使用类似List<GoodsInfo>的用户类型列表,而不是使用非类型安全的ArrayList。
  • 您无需获取Max记录来迭代所有记录。您可以使用while (sqlReader.Read())
  • 当你的sql语句总是记得在加入之前添加空格。
  • 您可以将using块与一次性对象一起使用,而无需通过代码关闭连接等。
  • 当您从阅读器获取值时,这些值可以为null。添加适当的验证来处理空值。

答案 4 :(得分:0)

在你的语句中代码

上的字符串
 sSql = "select * from P_MKZGood"
if (flag == true)
{
    sSql += "where IsCommend = 1";
}
  

这里的最终字符串是:从P_MKZGoodwhere中选择* IsCommend = 1“

将出现错误“语法不正确=”

  

您需要在“P_MKZGood”之前或之后指定空格,如此

 sSql = "select * from P_MKZGood "

 sSql += " where Iscommend = 1"
  

然后最后的字符串将是:从P_MKZGood中选择*,其中IsCommend = 1“

此处没有错误