【问题标题】:Procedure not working because of unresolved reference to object由于未解决对对象的引用,程序无法正常工作
【发布时间】:2019-08-31 07:47:22
【问题描述】:

我正在编写一个 WPF 应用程序,有时我试图通过如下过程向我的数据库中添加新行:

CREATE PROCEDURE dbo.InsertStudent
    @IdStudent INT,
    @FirstName VARCHAR(50),
    @LastName VARCHAR(50),
    @Address VARCHAR(50),
    @IndexNumber VARCHAR(50),
    @IdStudies INT
AS
    SET NOCOUNT ON

    INSERT INTO [dbo].[apbd.Student]
           ([IdStudent]
           ,[FirstName]
           ,[LastName]
           ,[Address]
           ,[IndexNumber]
           ,[IdStudies])
    VALUES
           (@IdStudent
           ,@FirstName
           ,@LastName
           ,@Address
           ,@IndexNumber
           ,@IdStudies)

但是每当我要使用它时,我都会遇到错误:

SQL71502:过程:[dbo].[InsertStudent] 对对象 [dbo].[apbd.Student] 有一个未解析的引用。

我一直在寻找解决方案,但我发现只是通过右键单击 References 等来添加对数据库的引用,但我的解决方案资源管理器中没有此选项。

也许我在错误的地方寻找它,但右键单击后我唯一的选择是这样的:

  1. 添加参考...
  2. 添加对服务的引用...
  3. 添加连接/串联/累积(或者无论如何应该翻译)服务
  4. 添加分析器...
  5. 管理 NuGet 数据包...

关于在数据库中创建表的代码:

CREATE SCHEMA apbd;

GO

-- tables
-- Table: Student
CREATE TABLE apbd.Student (
    IdStudent int  NOT NULL IDENTITY,
    FirstName nvarchar(100)  NOT NULL,
    LastName nvarchar(100)  NOT NULL,
    Address nvarchar(100)  NOT NULL,
    IndexNumber nvarchar(50) NOT NULL,
    IdStudies int  NOT NULL,
    CONSTRAINT Student_pk PRIMARY KEY  (IdStudent)
);

-- Table: Student_Subject
CREATE TABLE apbd.Student_Subject (
    IdStudentSubject int  NOT NULL IDENTITY,
    IdStudent int  NOT NULL,
    IdSubject int  NOT NULL,
    CreatedAt datetime  NOT NULL,
    CONSTRAINT Student_Subject_pk PRIMARY KEY  (IdStudentSubject,IdStudent,IdSubject)
);

-- Table: Studies
CREATE TABLE apbd.Studies (
    IdStudies int  NOT NULL IDENTITY,
    Name nvarchar(100)  NOT NULL,
    CONSTRAINT Studies_pk PRIMARY KEY  (IdStudies)
);

-- Table: Subject
CREATE TABLE apbd.Subject (
    IdSubject int  NOT NULL IDENTITY,
    Name nvarchar(100)  NOT NULL,
    CONSTRAINT Subject_pk PRIMARY KEY  (IdSubject)
);

-- End of file.

【问题讨论】:

  • 你的表名真的是[apbd.Student]吗?或者应该是 [apbd].[Student] 甚至是 [apbdStudent]
  • 嗯,错误意味着事实并非如此......
  • 如何发布为该表创建的语句
  • 如果将[dbo].[apbd.Student] 更改为apbd.Student 会发生什么?那它有用吗?
  • @mjwills 我确实重新测试了它,它很抱歉造成混乱......我想我之前一定放了其他东西,但起初我 100% 确定我确实写了 [apbd]。 [学生]。但是,感谢您的时间和帮助:)。

标签: c# sql-server wpf visual-studio


【解决方案1】:

默认情况下,MS SQL Server 数据库只有一个架构 (dbo)。您可以出于安全或组织目的添加架构以对事物进行分组。

在您的情况下,创建了架构 apbd 并且在该架构而不是 dbo 架构上创建了 Student。因此,要引用该表,您需要使用 [apbd].[Student]。

【讨论】:

    【解决方案2】:

    我将运行以下命令来确定表的实际名称和架构:

    SELECT
        CAST(
            MAX(
                CASE
                    WHEN
                        TABLE_SCHEMA = 'apbd'
                        AND TABLE_NAME = 'Student'
                    THEN 1
                    ELSE 0
                END
            ) AS bit
        ) [The table is apbd.Student]
        ,
            CAST(
                MAX(
                    CASE
                        WHEN
                            TABLE_SCHEMA = 'dbo'
                            AND TABLE_NAME = 'apbd.Student'
                        THEN 1
                        ELSE 0
                    END
                ) AS bit
            ) [The table is dbo.apbd.Student]
    FROM INFORMATION_SCHEMA.TABLES
    

    我还想知道您是否可能需要在 CREATE 脚本的开头使用 USE 语句 - 您是否在正确的数据库上创建过程?

    如果表在不同的数据库上,您需要在存储过程中引用该数据库,即[DatabaseName].[dbo].[apbd.Student]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多