当只有一个 table 值参数时,为过程分配了太多参数
Assigning too many parameters for procedure when having just only one table value parameter
我正在使用 asp.net(C#)、.NET 4、SQL Server 2012、IIS7。
我想使用 table 值参数将 excel 数据导入到 sql 服务器。但我遇到了问题。
这是部分代码:
C#
//extract excel data, only 10 fixed rows.
myEXcnnstring = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + Exfullname + "; Extended Properties=Excel 12.0;";
myEXcnn = new OleDbConnection(myEXcnnstring);
myEXcnn.Open();
myEXsql = "select '" + ExCompany + "' as mycompany,'" + ExProject + "' as myproject,'" + Exdate.ToShortDateString() + "' as mydate,* from [sheet1$A1:N10]";
myEXcmd = new OleDbCommand(myEXsql, myEXcnn);
myEXda = new OleDbDataAdapter(myEXcmd);
myEXdt = new DataTable();
myEXds = new DataSet();
myEXda.Fill(myEXds);
myEXdt = myEXds.Tables[0];
myEXcnn.Close();
// load to SQL SERVER
mycmd.CommandType = CommandType.StoredProcedure;
mycmd.CommandText = "dbo.loadCost";
SqlParameter tvpParam = mycmd.Parameters.AddWithValue("@TVPCost", myEXdt);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.TVP_Cost";
mycmd.ExecuteNonQuery();
myCnn.Close();
SQL 服务器定义 TVP
CREATE TYPE [dbo].[TVP_Cost] AS TABLE(
[mycompany] [nvarchar](50) NOT NULL,
[myproject] [nvarchar](50) NOT NULL,
[mydate] [date] NOT NULL,
[mytype] [nvarchar](50) NOT NULL,
[Area1] [numeric](18, 8) NOT NULL,
[Area2] [numeric](18, 8) NOT NULL,
--etc
)
GO
SQL 服务器存储过程
ALTER PROCEDURE [dbo].[loadCost]
@TVPCost dbo.TVP_Cost readonly
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Costtest (co1, co2,co3,co4,co5)
SELECT co1, co2, co3, co4, co5 from @TVPcost
END
错误信息是我给了太多参数来处理。但是我只有一个参数,一个table值的参数。
我注意到您没有声明 mycmd
。有没有可能你之前使用过那个 Command 对象,它里面已经有一些参数了?
命令对象很便宜,我总是抢一个新的:
var cmd = MyConnection.CreateCommand();
我正在使用 asp.net(C#)、.NET 4、SQL Server 2012、IIS7。
我想使用 table 值参数将 excel 数据导入到 sql 服务器。但我遇到了问题。 这是部分代码:
C#
//extract excel data, only 10 fixed rows.
myEXcnnstring = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + Exfullname + "; Extended Properties=Excel 12.0;";
myEXcnn = new OleDbConnection(myEXcnnstring);
myEXcnn.Open();
myEXsql = "select '" + ExCompany + "' as mycompany,'" + ExProject + "' as myproject,'" + Exdate.ToShortDateString() + "' as mydate,* from [sheet1$A1:N10]";
myEXcmd = new OleDbCommand(myEXsql, myEXcnn);
myEXda = new OleDbDataAdapter(myEXcmd);
myEXdt = new DataTable();
myEXds = new DataSet();
myEXda.Fill(myEXds);
myEXdt = myEXds.Tables[0];
myEXcnn.Close();
// load to SQL SERVER
mycmd.CommandType = CommandType.StoredProcedure;
mycmd.CommandText = "dbo.loadCost";
SqlParameter tvpParam = mycmd.Parameters.AddWithValue("@TVPCost", myEXdt);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.TVP_Cost";
mycmd.ExecuteNonQuery();
myCnn.Close();
SQL 服务器定义 TVP
CREATE TYPE [dbo].[TVP_Cost] AS TABLE(
[mycompany] [nvarchar](50) NOT NULL,
[myproject] [nvarchar](50) NOT NULL,
[mydate] [date] NOT NULL,
[mytype] [nvarchar](50) NOT NULL,
[Area1] [numeric](18, 8) NOT NULL,
[Area2] [numeric](18, 8) NOT NULL,
--etc
)
GO
SQL 服务器存储过程
ALTER PROCEDURE [dbo].[loadCost]
@TVPCost dbo.TVP_Cost readonly
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Costtest (co1, co2,co3,co4,co5)
SELECT co1, co2, co3, co4, co5 from @TVPcost
END
错误信息是我给了太多参数来处理。但是我只有一个参数,一个table值的参数。
我注意到您没有声明 mycmd
。有没有可能你之前使用过那个 Command 对象,它里面已经有一些参数了?
命令对象很便宜,我总是抢一个新的:
var cmd = MyConnection.CreateCommand();