首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

“必须声明表变量”的异常

2013-11-08 
“必须声明表变量”的错误如下包含参数查询语句,返回数据总数的函数private int GetTotalCount()//返回数据

“必须声明表变量”的错误
如下包含参数查询语句,返回数据总数的函数

private int GetTotalCount()    //返回数据总数
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Web_ConnectionString"].ConnectionString);
    SqlCommand cmd = con.CreateCommand();
        
    cmd.Parameters.Add(new SqlParameter("@table", SqlDbType.NVarChar, 50) { Value = type });  //type为一string类对象
    cmd.CommandText = "select count(*) from @table";

    con.Open();
    int sum = int.Parse(cmd.ExecuteScalar().ToString());    //此处调试出错
    con.Close();
    return sum;
}

运行时出现必须声明表变量的错误。

必须声明表变量 "@type"。

说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.Data.SqlClient.SqlException: 必须声明表变量 "@type"。

源错误: 


行 80: 
行 81:         con.Open();
行 82:         int sum = int.Parse(cmd.ExecuteScalar().ToString());
行 83:         con.Close();
行 84:         return sum;

源文件: d:\Programming\东乡行\WebSite1\List.aspx.cs    行: 82 

堆栈跟踪: 


[SqlException (0x80131904): 必须声明表变量 "@type"。]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +2073422
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +5063564
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2275
   System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
   System.Data.SqlClient.SqlDataReader.get_MetaData() +86
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +311
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +987
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
   System.Data.SqlClient.SqlCommand.ExecuteScalar() +139
   List.GetTotalCount() in d:\Programming\东乡行\WebSite1\List.aspx.cs:82
   List.GetRepeaterList() in d:\Programming\东乡行\WebSite1\List.aspx.cs:123
   List.Load_This_Page() in d:\Programming\东乡行\WebSite1\List.aspx.cs:43
   List.Page_Load(Object sender, EventArgs e) in d:\Programming\东乡行\WebSite1\List.aspx.cs:35
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
   System.Web.UI.Control.OnLoad(EventArgs e) +91
   System.Web.UI.Control.LoadRecursive() +74
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2207
C# ASP.NET SQL 参数
[解决办法]
表名作为参数,必须通过拼接字符串的形式。类似的还有字段名,order by等sql关键字都必须拼接字符串。
简单一点的方法是不使用参数。

private int GetTotalCount()    //返回数据总数
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Web_ConnectionString"].ConnectionString);
    SqlCommand cmd = con.CreateCommand();
         
    cmd.CommandText = string.Format("select count(*) from {0}",type);
 
    con.Open();
    int sum = int.Parse(cmd.ExecuteScalar().ToString());    //此处调试出错


    con.Close();
    return sum;
}



[解决办法]
]@table是文本类型,假设传进来的值是“job”,
反应到语句当中就是 select count(*) from‘job’,这里明显就错了,如果写明表名,就不会报错



像7#那样可以

热点排行