查询工作正常,但 SQLCommand 抛出 'invalid name'
Query works fine,but SQLCommand throws 'invalid name'
我有这个查询字符串,当我手动 运行 它时它工作正常:
private const string _sold_products_query = @"SELECT rp.Id, pl.ProductName, rp.Price, rp.[StatusDate] FROM [dbo].product_name_list as pl INNER JOIN [dbo].sold_products as rp ON pl.Id = rp.FK_product_name_list;";
如果我这样做仍然不起作用:
private const string _sold_products_query = @"SELECT rp.Id, pl.ProductName, rp.Price, rp.StatusDate FROM dbo.product_name_list as pl INNER JOIN dbo.sold_products as rp ON pl.Id = rp.FK_product_name_list;";
如果像这样把括号放在各处也是一样的:
private const string _sold_products_query = @"SELECT [rp].[Id], [pl].[ProductName], [rp].[Price], [rp].[StatusDate] FROM [dbo].[product_name_list] as pl INNER JOIN [dbo].[sold_products] as rp ON [pl].[Id] = [rp].[FK_product_name_list];";
但是当我将它作为参数放入 SQLCommand 对象和 运行 methon ExecuteReader 时它抛出这个异常:
System.Data.SqlClient.SqlException: 'Invalid column name 'StatusDate'.'
代码:
SqlCommand command = new SqlCommand(_sold_products_query, conn);
SqlDataReader dataReader = command.ExecuteReader();
查询表:
创建 TABLE 语句:
CREATE TABLE [product_name_list] (
[Id] int NOT NULL PRIMARY KEY IDENTITY(1,1),
[ProductName] varchar(255) NOT NULL UNIQUE
);
CREATE TABLE [sold_products] (
[Id] int NOT NULL PRIMARY KEY IDENTITY(1,1),
[FK_product_name_list] int FOREIGN KEY REFERENCES product_name_list(Id),
[Price] decimal,
[StatusDate] Date
);
连接字符串工作正常,因为另一个查询工作。有谁知道为什么它不起作用?
可能是 [] 括号导致了问题。尝试删除它们或更改为以下内容。
private const string _sold_products_query = @"SELECT [rp].[Id], [pl].[ProductName], [rp].[Price], [rp].[StatusDate] FROM [dbo].[product_name]_list as pl INNER JOIN [dbo].[sold_products] as rp ON [pl].[Id] = [rp].[FK_product_name_list];";
通常,您会在所有内容或什么都不使用方括号。在我看来,这种方式要好得多,而不是在某些数据上使用方括号而不是其他数据。
如何调试:
exec sp_columns sold_products
来自您的 C# 代码将为您提供来自 table sold_products
的所有列信息,如果与您在 SSMS 中看到的不同,您正在连接到不同的实例或数据库。
您的 SqlConnection 或 DbConnection 有 属性 ConnectionString。
从 SSMS 获取连接信息
每个 SSMS window 的底部是以下状态栏。 (截图来自SSMS 18)
- 是你的实例
- 是您的登录名
- 是当前连接的数据库。
(你也可以在SSMS的属性window中看到这个)
Connectionstring 属性应与您的 SSMS 连接匹配。
额外
在 ssms 中,如果您使用注册服务器 window (CTRL+ALT[=46=,您甚至可以一次连接到多个实例]+G)。已连接将显示 X/Y。 X = 打开的连接数,Y 是尝试的连接数。如果您需要一次查询多个实例,这很有用。
我有这个查询字符串,当我手动 运行 它时它工作正常:
private const string _sold_products_query = @"SELECT rp.Id, pl.ProductName, rp.Price, rp.[StatusDate] FROM [dbo].product_name_list as pl INNER JOIN [dbo].sold_products as rp ON pl.Id = rp.FK_product_name_list;";
如果我这样做仍然不起作用:
private const string _sold_products_query = @"SELECT rp.Id, pl.ProductName, rp.Price, rp.StatusDate FROM dbo.product_name_list as pl INNER JOIN dbo.sold_products as rp ON pl.Id = rp.FK_product_name_list;";
如果像这样把括号放在各处也是一样的:
private const string _sold_products_query = @"SELECT [rp].[Id], [pl].[ProductName], [rp].[Price], [rp].[StatusDate] FROM [dbo].[product_name_list] as pl INNER JOIN [dbo].[sold_products] as rp ON [pl].[Id] = [rp].[FK_product_name_list];";
但是当我将它作为参数放入 SQLCommand 对象和 运行 methon ExecuteReader 时它抛出这个异常:
System.Data.SqlClient.SqlException: 'Invalid column name 'StatusDate'.'
代码:
SqlCommand command = new SqlCommand(_sold_products_query, conn);
SqlDataReader dataReader = command.ExecuteReader();
查询表:
创建 TABLE 语句:
CREATE TABLE [product_name_list] (
[Id] int NOT NULL PRIMARY KEY IDENTITY(1,1),
[ProductName] varchar(255) NOT NULL UNIQUE
);
CREATE TABLE [sold_products] (
[Id] int NOT NULL PRIMARY KEY IDENTITY(1,1),
[FK_product_name_list] int FOREIGN KEY REFERENCES product_name_list(Id),
[Price] decimal,
[StatusDate] Date
);
连接字符串工作正常,因为另一个查询工作。有谁知道为什么它不起作用?
可能是 [] 括号导致了问题。尝试删除它们或更改为以下内容。
private const string _sold_products_query = @"SELECT [rp].[Id], [pl].[ProductName], [rp].[Price], [rp].[StatusDate] FROM [dbo].[product_name]_list as pl INNER JOIN [dbo].[sold_products] as rp ON [pl].[Id] = [rp].[FK_product_name_list];";
通常,您会在所有内容或什么都不使用方括号。在我看来,这种方式要好得多,而不是在某些数据上使用方括号而不是其他数据。
如何调试:
exec sp_columns sold_products
来自您的 C# 代码将为您提供来自 table sold_products
的所有列信息,如果与您在 SSMS 中看到的不同,您正在连接到不同的实例或数据库。
您的 SqlConnection 或 DbConnection 有 属性 ConnectionString。
从 SSMS 获取连接信息
每个 SSMS window 的底部是以下状态栏。 (截图来自SSMS 18)
- 是你的实例
- 是您的登录名
- 是当前连接的数据库。
(你也可以在SSMS的属性window中看到这个)
Connectionstring 属性应与您的 SSMS 连接匹配。
额外
在 ssms 中,如果您使用注册服务器 window (CTRL+ALT[=46=,您甚至可以一次连接到多个实例]+G)。已连接将显示 X/Y。 X = 打开的连接数,Y 是尝试的连接数。如果您需要一次查询多个实例,这很有用。