日期:2014-05-18  浏览次数:21158 次

C#动态调用数据库报错(必须声明表变量&表值函数对象)
存储过程版本:[code=SQL][/code]
USE [Remote Calibration]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[StoredProcedureAddRows]
  @rowindex int,
@tablename nvarchar(80)
AS
  BEGIN
  DECLARE @newtable table
  (SeQuence int PRIMARY KEY NOT NULL,
  Calibrator varchar(15),
  UUT varchar(15),
  Target varchar(15),
  Item varchar(45),
  Command varchar(45),
  TimeInterval int,
  Discription varchar(50))
  DECLARE @sql nvarchar(80)
  SET @sql='INSERT INTO @newtable SELECT * FROM '+@tablename;
  EXEC(@sql)  
UPDATE @newtable
SET SeQuence=SeQuence+1 WHERE SeQuence > @rowindex
  DECLARE @sql2 varchar(80)
  SET @sql2=N'INSERT INTO @newtable(SeQuence) VALUES ('+@rowindex+N')'
EXEC(@sql2)
  END
RETURN
执行存储过程时报错如下:
消息1087,级别15,状态2,第1 行
必须声明表变量"@newtable"。

(0 行受影响)
消息245,级别16,状态1,过程StoredProcedureAddRows,第27 行
在将nvarchar 值'INSERT INTO @newtable(SeQuence) VALUES (' 转换成数据类型int 时失败。
函数版本:[code=SQL][/code]
USE [Remote Calibration]
GO
/****** 对象: UserDefinedFunction [dbo].[AddRows] 脚本日期: 04/17/2012 09:16:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[AddRows]
(
@rowindex int,
@tablename nvarchar(80)
/*@parameter1 int = 5,
@parameter2 datatype
*/
)
RETURNS @newtable TABLE
( SeQuence int PRIMARY KEY NOT NULL,
  Calibrator varchar(15),
  UUT varchar(15),
  Target varchar(15),
  Item varchar(45),
  Command varchar(45),
  TimeInterval int,
  Discription varchar(50) )
/* @table_variable TABLE (column1 datatype, column2 datatype) */
AS
BEGIN
  DECLARE @sql AS NVARCHAR(100);
  SET @sql='INSERT INTO @newtable SELECT * FROM @tablename;';
  EXEC sp_executesql
  @stmt=@sql  
UPDATE @newtable
SET SeQuence=SeQuence+1 WHERE SeQuence > @rowindex
INSERT INTO @newtable(SeQuence) VALUES (@rowindex)
/* INSERT INTO @table_variable
SELECT ... FROM ... */
RETURN
END
C#调用:
[code=C#][/code]
string strSql = "StoredProcedureAddRows";
  SqlCommand cmd = new SqlCommand(strSql, con);
  cmd.CommandType = CommandType.StoredProcedure;
  cmd.Parameters.Add("@rowindex", SqlDbType.Int).Value = rowtoadd;
  cmd.Parameters["@rowindex"].Direction = ParameterDirection.Input;
  cmd.Parameters.Add("@tablename", SqlDbType.NVarChar).Value = "ViewKeithley2000_M8831";
  cmd.Parameters["@tablename"].Direction = ParameterDirection.Input;
  cmd.ExecuteReader();
报错:错误:过程AddRows的请求失败,因为AddRows是表值函数对象
想了很久也找不到错误原因,望高手指点

------解决方案--------------------
@newtable是变量,你在存储过程中没有声明就用,当然不行了,像@tablename nvarchar(80)一样声明
------解决方案--------------------
先将@newtable定义为一个常量测试一下,排除@newtable未定义的问题,看看是否还报错?然后解决下一步的问题啊。
------解决方案--------------------
可以用临时表代替表变量