【问题标题】:Error in sql select statementsql 选择语句中的错误
【发布时间】:2013-10-08 23:09:33
【问题描述】:

我有以下用于在表格中搜索文本的方法

protected void fillGridView(int followingID, string text)
    {

        SqlCommand myCommand = new SqlCommand("select t.*,u.firstName,u.lastName,u2.firstName as afirstName,u2.lastName as alastName ,i.icon,ii.iconPath as taskIcon, iii.iconPath as seenIcon,f.fileName,f.fileID from tasks as t inner join users as u on u.userID=t.addedBy inner join users as u2 on u2.userID=t.attachTo inner join priorityIcons as i on t.priority=i.priorityID inner join icons as ii on t.status=ii.iconName inner join icons as iii on t.isNew=iii.iconName left join files as f on t.fileID=f.fileID where t.followingID=@followingID and t.firstName LIKE '%asd%'");


        myCommand.Parameters.AddWithValue("@followingID", followingID);
        myCommand.Parameters.AddWithValue("@text", text);            

        DBAccess db = new DBAccess();
        DataSet ds = db.select(myCommand);

        SqlDataAdapter adapter = new SqlDataAdapter();

        tasksRepeater.DataSourceID = null;
        tasksRepeater.DataSource = ds.Tables[0]; //Here the exception appear because the dataset ds is "null" 
        tasksRepeater.DataBind();
        tasksCounter();
    }

异常消息是“对象引用未设置为对象的实例。”

但是当我将上面的sql语句与下面的交换时,代码运行成功

SqlCommand myCommand = new SqlCommand("select t.*,u.firstName,u.lastName,u2.firstName as afirstName,u2.lastName as alastName ,i.icon,ii.iconPath as taskIcon, iii.iconPath as seenIcon,f.fileName,f.fileID from tasks as t inner join users as u on u.userID=t.addedBy inner join users as u2 on u2.userID=t.attachTo inner join priorityIcons as i on t.priority=i.priorityID inner join icons as ii on t.status=ii.iconName inner join icons as iii on t.isNew=iii.iconName left join files as f on t.fileID=f.fileID where t.followingID=@followingID"); 

那么问题出在哪里!?

【问题讨论】:

  • “对象引用未设置为对象的实例”是您尝试访问尚未初始化的内容时遇到的异常。找出尚未初始化的值。堆栈跟踪应指示这发生在哪一行代码上。或者您可以调试并在抛出异常时让它中断。我猜这与您的控件的生命周期有关,例如 tasksRepeater 为空而不是您的 SQL。
  • 问题出在sql语句中,我敢肯定。因为当我用另一个没有“like word”的sql语句更改时,代码运行成功..
  • 根据您提供的新信息,我想说您需要查看您的 DBAccess 类,看看在什么情况下它将返回 null 值而不是数据集。事实上,尝试使用调试器单步执行 select 方法,看看到底发生了什么。

标签: asp.net sql-server c#-4.0 sql


【解决方案1】:

您的查询没有返回任何行,所以当您执行 ds.Tables[0] 时它会抛出,因为 ds.Tables 是空的。

我怀疑您的查询有错字,因为您正在设置@text 参数的值,但查询中不存在该参数。您的查询可能需要以以下结尾:

"...where t.followingID=@followingID and t.firstName LIKE '%@text%'"

话虽如此,您的代码应该能够处理查询不返回任何行的情况(您可以通过检查ds.Tables 上的Count 属性来检查这一点)。

【讨论】:

  • 与其说ds.Tables为空,不如说他的DBAccess.select()方法返回了一个空值。
【解决方案2】:

我猜错误出现在 where 子句中。请尝试使用此查询

"select t.*,u.firstName,u.lastName,u2.firstName as afirstName,u2.lastName as alastName ,i.icon,ii.iconPath as taskIcon, iii.iconPath as seenIcon,f.fileName,f.fileID from tasks as t inner join users as u on u.userID=t.addedBy inner join users as u2 on u2.userID=t.attachTo inner join priorityIcons as i on t.priority=i.priorityID inner join icons as ii on t.status=ii.iconName inner join icons as iii on t.isNew=iii.iconName left join files as f on t.fileID=f.fileID where t.followingID=@followingID and u.firstName LIKE '%asd%'"

用 u.FirstName 代替 t.firstName。

我猜错误是在 t 的别名中。

试试这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多