'='附近语法错误

本文关键字:错误 语法 | 更新日期: 2023-09-27 18:12:01

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

这是我的:

   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());

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

现在修复了,谢谢大家,我觉得这个错误是多么愚蠢;)

'='附近语法错误

您的SQL字符串在P_MKZGoodwhere之间需要一个空格

好,您添加了asp.net错误的图像,它显示了您获得SqlException的行号:

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

无论cmd的值是多少。CommandText是在这一点上(我不能告诉,因为你还没有包括这一行以上的代码)最有可能有一个t-sql语法错误类似于一个进一步在你的代码,我在下面调用:

尝试在表名后添加一个空格:

sSql = "select * from P_MKZGood ";

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

select * from P_MKZGoodwhere isrecommend = 1

注意P_MKZGood之间没有空格,其中。这是导致抛出SqlException的语法冲突。

@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";

根据你之前和这个问题,我认为你需要下面的方法。正如其他人提到的,在编码中有许多错误和地方可以改进。检查下面的代码

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。
  • 你不需要获取最大记录来迭代所有记录。你可以使用while (sqlReader.Read())
  • 当你使用sql语句时,一定要记得在连接前加空格。
  • 你可以用一次性对象使用using块,你不需要通过代码关闭连接等。
  • 当您从读取器获得值时,这些值可以为空。添加适当的验证来处理空值。

在你的语句中,代码的字符串

 sSql = "select * from P_MKZGood"
if (flag == true)
{
    sSql += "where IsCommend = 1";
}

这里的最后一个字符串是:select * from P_MKZGoodwhere isrecommend = 1"

会出现错误" error syntax incorrect near = "

您需要像这样指定"P_MKZGood"之前或之后的空格

 sSql = "select * from P_MKZGood "

 sSql += " where Iscommend = 1"

那么最后的字符串将是:select * from P_MKZGood where isrecommend = 1"

No Error is here