从 C# 执行存储过程会出现错误 Invalid column name 'testTable2'
Executing a Stored Procedure from C# gives the error Invalid column name 'testTable2'
我创建了一个存储过程,如果这个 table 不存在,它会创建一个 table。
commented code
可以成功执行这段代码。
现在的问题是我尝试从 C#
执行这段代码,我在其中重写了程序,因此我可以传递一个参数:@tableName sysname
,它是 table 我尝试创建:IF NOT EXISTS
.
但是,我收到了这个错误,我不明白为什么会得到:
System.Data.SqlClient.SqlException: 'Invalid column name 'testTable2'. Invalid column name 'U'.'
存储过程代码:
(注释的代码可以自行执行。后面的代码应该类似,但从 C# 执行时会收到错误)
--CREATE PROCEDURE createNewTable
--AS
--IF NOT EXISTS(SELECT * FROM sys.sysobjects WHERE Name = N'testTable2' AND xtype = N'U')
--BEGIN
--CREATE TABLE testTable2
--(
-- [DateTime] SMALLDATETIME NOT NULL,
-- [FeatureNbr] SMALLINT NOT NULL,
-- [Value] FLOAT (53) NULL,
-- [Bool] BIT NULL,
-- CONSTRAINT UC_testTable2 UNIQUE (DateTime),
-- CONSTRAINT PK_testTable2 PRIMARY KEY (FeatureNbr, DateTime)
--);
--END
CREATE PROCEDURE createNewTable
@tableName sysname
AS
BEGIN
DECLARE @FullQuery nvarchar(1000)
SET @FullQuery = N'IF NOT EXISTS (SELECT * FROM sys.sysobjects WHERE Name = ' + QUOTENAME(@tableName) + ' AND xtype=U) ' +
'CREATE TABLE ' + QUOTENAME(@tableName) + ' ([DateTime] SMALLDATETIME NOT NULL, [FeatureNbr] SMALLINT NOT NULL, [Value] FLOAT (53) NULL, [Bool] BIT NULL,
CONSTRAINT ' + QUOTENAME(CONCAT(N'UC_',@tableName)) + ' UNIQUE (DateTime),
CONSTRAINT ' + QUOTENAME(CONCAT(N'PK_',@tableName)) + ' PRIMARY KEY (FeatureNbr, DateTime)); '
EXECUTE sp_executesql
@FullQuery;
END
C#代码:(执行createNewTable
存储过程的代码)
void createNewTable()
{
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
SqlCommand cmd = new SqlCommand("createNewTable", conn); //1. create a command object identifying the stored procedure
cmd.CommandType = CommandType.StoredProcedure; //2. set the command object so it knows to execute a stored procedure
cmd.Parameters.Add(new SqlParameter("@tableName", "testTable2"));
cmd.ExecuteNonQuery();
}
}
static private string GetConnectionString()
{
return "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\andre\source\repos\TestDatabaseCreation\DatabaseTest.mdf;Integrated Security=True;Connect Timeout=30";
}
我能够像这样在我的 tempdb 中创建这样的 table:
declare @tableName sysname
set @tableName = N'testTable2'
DECLARE @FullQuery nvarchar(1000)
SET @FullQuery = N'IF NOT EXISTS (SELECT * FROM sys.sysobjects WHERE Name = ''' + @tableName + ''' AND xtype=''U'') ' +
'CREATE TABLE ' + QUOTENAME(@tableName) + ' ([DateTime] SMALLDATETIME NOT NULL, [FeatureNbr] SMALLINT NOT NULL, [Value] FLOAT (53) NULL, [Bool] BIT NULL,
CONSTRAINT ' + QUOTENAME(CONCAT(N'UC_',@tableName)) + ' UNIQUE (DateTime),
CONSTRAINT ' + QUOTENAME(CONCAT(N'PK_',@tableName)) + ' PRIMARY KEY (FeatureNbr, DateTime)); '
EXECUTE sp_executesql @FullQuery;
引用问题在 if 语句中。
我创建了一个存储过程,如果这个 table 不存在,它会创建一个 table。
commented code
可以成功执行这段代码。
现在的问题是我尝试从 C#
执行这段代码,我在其中重写了程序,因此我可以传递一个参数:@tableName sysname
,它是 table 我尝试创建:IF NOT EXISTS
.
但是,我收到了这个错误,我不明白为什么会得到:
System.Data.SqlClient.SqlException: 'Invalid column name 'testTable2'. Invalid column name 'U'.'
存储过程代码:
(注释的代码可以自行执行。后面的代码应该类似,但从 C# 执行时会收到错误)
--CREATE PROCEDURE createNewTable
--AS
--IF NOT EXISTS(SELECT * FROM sys.sysobjects WHERE Name = N'testTable2' AND xtype = N'U')
--BEGIN
--CREATE TABLE testTable2
--(
-- [DateTime] SMALLDATETIME NOT NULL,
-- [FeatureNbr] SMALLINT NOT NULL,
-- [Value] FLOAT (53) NULL,
-- [Bool] BIT NULL,
-- CONSTRAINT UC_testTable2 UNIQUE (DateTime),
-- CONSTRAINT PK_testTable2 PRIMARY KEY (FeatureNbr, DateTime)
--);
--END
CREATE PROCEDURE createNewTable
@tableName sysname
AS
BEGIN
DECLARE @FullQuery nvarchar(1000)
SET @FullQuery = N'IF NOT EXISTS (SELECT * FROM sys.sysobjects WHERE Name = ' + QUOTENAME(@tableName) + ' AND xtype=U) ' +
'CREATE TABLE ' + QUOTENAME(@tableName) + ' ([DateTime] SMALLDATETIME NOT NULL, [FeatureNbr] SMALLINT NOT NULL, [Value] FLOAT (53) NULL, [Bool] BIT NULL,
CONSTRAINT ' + QUOTENAME(CONCAT(N'UC_',@tableName)) + ' UNIQUE (DateTime),
CONSTRAINT ' + QUOTENAME(CONCAT(N'PK_',@tableName)) + ' PRIMARY KEY (FeatureNbr, DateTime)); '
EXECUTE sp_executesql
@FullQuery;
END
C#代码:(执行createNewTable
存储过程的代码)
void createNewTable()
{
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
SqlCommand cmd = new SqlCommand("createNewTable", conn); //1. create a command object identifying the stored procedure
cmd.CommandType = CommandType.StoredProcedure; //2. set the command object so it knows to execute a stored procedure
cmd.Parameters.Add(new SqlParameter("@tableName", "testTable2"));
cmd.ExecuteNonQuery();
}
}
static private string GetConnectionString()
{
return "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\andre\source\repos\TestDatabaseCreation\DatabaseTest.mdf;Integrated Security=True;Connect Timeout=30";
}
我能够像这样在我的 tempdb 中创建这样的 table:
declare @tableName sysname
set @tableName = N'testTable2'
DECLARE @FullQuery nvarchar(1000)
SET @FullQuery = N'IF NOT EXISTS (SELECT * FROM sys.sysobjects WHERE Name = ''' + @tableName + ''' AND xtype=''U'') ' +
'CREATE TABLE ' + QUOTENAME(@tableName) + ' ([DateTime] SMALLDATETIME NOT NULL, [FeatureNbr] SMALLINT NOT NULL, [Value] FLOAT (53) NULL, [Bool] BIT NULL,
CONSTRAINT ' + QUOTENAME(CONCAT(N'UC_',@tableName)) + ' UNIQUE (DateTime),
CONSTRAINT ' + QUOTENAME(CONCAT(N'PK_',@tableName)) + ' PRIMARY KEY (FeatureNbr, DateTime)); '
EXECUTE sp_executesql @FullQuery;
引用问题在 if 语句中。