C# 在C中以编程方式创建数据库和定义表#
我试图定义一个数据库,并使用C#程序在其中创建一个表。我使用的是SQL server和一个SQL脚本文件,一次读取并执行一条语句,“GO”是语句分隔符。基本技术如本文和MSDN上的响应中所述-通过SqlCommand和ExecuteOnQuery提交DDL命令 基本上,我正在使用ExecuteOnQuery处理SQL脚本文件中的每个命令。然而,对于USE语句,我正在解析数据库名称,然后将其插入到我在应用程序的其他区域中使用的工作连接字符串中。然后我使用SqlConnection连接到该数据库 该脚本包含一个USE[master],然后是CREATE数据库和一组alter,后面是刚刚创建的数据库的用法。这就是我的问题所在。第一次使用工作正常,创建了数据库,每个ALTER语句也工作正常。当我点击第二个USE语句时,对于我刚刚成功创建的数据库,我得到一个SqlException,告诉我我提供的用户名登录失败。如果我从连接字符串中删除了用户和密码,我只会得到相同的异常,告诉我用户“”的登录失败。顺便说一句,在处理第二个USE语句之前,我关闭了原始连接(到[master]),因为我打算建立一个到新数据库的新连接 脚本中的下一条语句是createuser,用于在新创建的数据库中定义用户。如果我无法连接到它,我该怎么做?或者问题是如何连接到新数据库,以便定义用户,更重要的是,定义表?我不确定在新数据库中定义用户是否有那么重要,但定义表是绝对必要的,除非我可以连接到该数据库,否则我无法做到这一点C# 在C中以编程方式创建数据库和定义表#,c#,sql,sql-server,database,C#,Sql,Sql Server,Database,我试图定义一个数据库,并使用C#程序在其中创建一个表。我使用的是SQL server和一个SQL脚本文件,一次读取并执行一条语句,“GO”是语句分隔符。基本技术如本文和MSDN上的响应中所述-通过SqlCommand和ExecuteOnQuery提交DDL命令 基本上,我正在使用ExecuteOnQuery处理SQL脚本文件中的每个命令。然而,对于USE语句,我正在解析数据库名称,然后将其插入到我在应用程序的其他区域中使用的工作连接字符串中。然后我使用SqlConnection连接到该数据库 该
有什么想法吗?我觉得我错过了一些明显的东西,但我已经在这堵墙上撞了一段时间了 好的,首先,您不需要关闭连接。使用[DatabaseName]将切换上下文,您将在数据库上 下面是以编程方式创建数据库和登录的脚本。但是,在第一次运行时,系统必须使用Windows凭据来创建数据库。后续运行可以通过新的数据库用户执行
USE [master]
SET QUOTED_IDENTIFIER ON
GO
--1. Create Database
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'YourDatabase')
BEGIN
ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [YourDatabase]
END
/* Create Marketplace_v1_1 database. */
USE [master]
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE DATABASE "YourDatabase"
GO
USE [master]
GO
ALTER DATABASE [YourDatabase] MODIFY FILE ( NAME = N'YourDatabase', FILEGROWTH = 10%)
GO
--2. Create Login/USer
USE [YourDatabase]
GO
IF EXISTS (SELECT * FROM sys.database_principals WHERE name = N'YourDatabaseUserName')
DROP USER [YourDatabaseUserName]
GO
USE [master]
GO
IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'YourDatabaseUserName')
DROP LOGIN [YourDatabaseUserName]
GO
CREATE LOGIN [YourDatabaseUserName]
WITH PASSWORD=N'YourPassword'
, DEFAULT_DATABASE=[YourDatabase]
, CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [YourDatabase]
GO
--3. Grant Permission to your user, you can remove unecessary permissions depending on your requirements
--3.1 Permissions To read/write data to tables
CREATE USER [YourDatabaseUserName] FOR LOGIN [YourDatabaseUserName]
EXEC sp_addrolemember N'db_datareader', N'YourDatabaseUserName'
EXEC sp_addrolemember N'db_datawriter', N'YourDatabaseUserName'
GO
--3.2. Permissions to backup/restore database
EXEC master..sp_addsrvrolemember @loginame = N'YourDatabaseUserName', @rolename = N'bulkadmin'
GO
EXEC master..sp_addsrvrolemember @loginame = N'YourDatabaseUserName', @rolename = N'dbcreator'
GO
USE [YourDatabase]
GO
EXEC sp_addrolemember N'db_owner', N'YourDatabaseUserName'
GO
EXEC sys.sp_addsrvrolemember @loginame = N'YourDatabaseUserName', @rolename = N'processadmin'
GO
USE [YourDatabase]
GO
EXEC sp_addrolemember N'db_backupoperator', N'YourDatabaseUserName'
GO
--3.3. Grant permissions to operate on database objects
USE [YourDatabase]
GO
GRANT CREATE TABLE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT AUTHENTICATE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT BACKUP DATABASE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT BACKUP LOG TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT CREATE FUNCTION TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT CREATE PROCEDURE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT CREATE TYPE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT CREATE VIEW TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT DELETE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT EXECUTE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT INSERT TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT SELECT TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT UPDATE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT ALTER ON SCHEMA::dbo TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT REFERENCES TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT ALTER ANY ROLE TO [YourDatabaseUserName]
GO
USE [YourDatabase]
GO
GRANT CONTROL TO [YourDatabaseUserName]
GO
直接执行脚本可能会更容易。SQLCommand不是为脚本执行而生成的。看这条线。您可以将脚本作为参数传递到
SQLCMD.exe
。可能更容易。我以前确实是这样做的,但在清楚地了解问题发生的地方(如果有问题的话)方面遇到了一些问题。不过,你说得对,解决这些问题可能更容易。是的,不关闭连接才是答案。我没有意识到USE语句会像其他DDL语句一样由ExecuteOnQuery处理。谢谢