0

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

这就是我所拥有的:

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

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

现在已修复,谢谢大家,我对这个错误感到多么愚蠢;)

4

5 回答 5

6

您的 SQL 字符串在P_MKZGood和之间需要一个空格where

于 2013-05-03T03:43:07.660 回答
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_MKZGoodwhere之间没有空格。这是导致抛出 SqlException 的语法冲突。

于 2013-05-03T03:45:43.007 回答
0

@SLaks 和 @Phage 已经准确地指出了您的问题,但我想添加我自己的两分钱。如果您在该行上放置一个断点,cmd.CommandText = sSql;您将看到sSql,何时flag == true,等于select * from P_MKZGoodwhere IsCommend = 1。(也就是说,P_MKZGood和之间没有空格where。)

你需要的是select * from P_MKZGood where IsCommend = 1. 我建议在开头添加一个空格

sSql += "where IsCommend = 1";

因此,相反,

sSql += " where IsCommend = 1";
于 2013-05-03T03:59:34.253 回答
0

在您的声明中,代码上的字符串

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

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

会有错误“= 附近的语法不正确”

您需要像这样在“P_MKZGood”之前或之后指定空格

 sSql = "select * from P_MKZGood "

或者

 sSql += " where Iscommend = 1"

然后最终的字符串将是: select * from P_MKZGood where IsCommend = 1"

这里没有错误

于 2013-05-03T05:07:27.200 回答
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块与一次性对象一起使用,而无需通过代码关闭连接等。
  • 当您从 reader 获取值时,这些值可以为 null。添加适当的验证来处理空值。
于 2013-05-03T04:22:45.140 回答