--Context查询到的是这样的 但是无法运行 报出 找不到CommandConfig if not Exists(select * from sysobjects where name='T_CommandConfig' and xtype='U') begin create database CommandConfig create table CommandConfig.dbo.T_CommandConfig(CODE varchar(30),ADDRESS varchar(30),COM varchar(30)) end--改这样就没问题了 create database CommandConfig go if not Exists(select * from sysobjects where name='T_CommandConfig' and xtype='U') begin create table CommandConfig.dbo.T_CommandConfig(CODE varchar(30),ADDRESS varchar(30),COM varchar(30)) end要先进行数据库是否存在判断
刚才试了一下确实是,用select * from master.dbo.sysdatabases where name='CommandConfig' 能查到结果, 但是用if not Exists(select * from sysobjects where name='T_CommandConfig'and xtype='U'查不到结果,但是数据库CommandConfig中不是已经存在这个表了吗,为什么查不到呢 这是那个连接配置connectionString="server=127.0.0.1; uid=sa;password=Dong201127012"/>
能够实现判断功能了,非常感谢两位的帮忙 稍微总结一下问题所在:最主要的原因在于查询表存不存在时没有指明数据库,所以一直查不到结果,也就一直执行后面的创建语句。 附上最后的代码,仅供参考 SqlConnection conn = new SqlConnection(connectionString); conn.Open(); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = @"if not Exists(select * from master.dbo.sysdatabases where name='CommandConfig') begin create database CommandConfig end"; cmd.ExecuteNonQuery(); cmd.CommandText = @"if not Exists(select * from CommandConfig.sys.sysobjects where name='T_CommandConfig'and xtype='U') begin create table CommandConfig.dbo.T_CommandConfig(CODE varchar(30),ADDRESS varchar(30),COM varchar(30),BUTERATE varchar(30),PROTOCOL varchar(30),PARITY varchar(30),TYPE varchar(30)) end if not Exists(select * from CommandConfig.sys.sysobjects where name='T_datagather'and xtype='U') begin create table CommandConfig.dbo.T_datagather(DEVICE varchar(30),DATA float,TIME datetime) end";
断点,把拼接好的字符串复制出来,放数据库里执行一下,就知道到底差什么了
开头粘出来的那个就是在sql数据库中运行成功的语句,把他拿到C#下面来就出错了
而不要把整个sql语句放c#里拼接执行
开头粘出来的那个就是在sql数据库中运行成功的语句,把他拿到C#下面来就出错了
我是说,你把C#里拼接出来的东西重新复制出来,再执行
你能保证代码拼接的字符串跟原来的是一模一样的?
首先那些\r\n就多余的
"from " +
"table1"
建议 把语句放到储存过程proc中,C#中直接执行proc,方便维护表结构。
string s = @"if not Exists(select * from sysobjects where name = 'T_CommandConfig'and xtype='U')
begin
create database CommandConfig
create table CommandConfig.dbo.T_CommandConfig(CODE varchar(30),ADDRESS varchar(30),COM varchar(30),BUTERATE varchar(30),PROTOCOL varchar(30),PARITY varchar(30),TYPE varchar(30))
end; ";9楼说的对,像这样写,把SQL语句直接这样写进去好了,不要胡乱拼接
很明显你最后的代码end后面连分号都没加,光目测就问题一大堆
这个是用string s=@“....”;的拼接结果还是一样的
create database CommandConfig
????
表不存在跟创建数据库有什么关系
那个and前面原本是有空格的,后来我改的,不过结果都一样,不行
那个and前面原本是有空格的,后来我改的,不过结果都一样,不行
什么逻辑
如果现在的数据库不存在这个表,你可以直接在当前数据库下建表
而如果你想在另外的数据库里建表,首先你就要判断另外的数据库是否存在,如果已经存在,还要再判断那个数据库是否有这个表
你判断的跟你创建的东西根本都不一样
那么很可能第一次能够正确执行,之后再执行就一定会出错
如果没有,就创建个文件夹叫2,里面放个3.txt第一次创建成功,第二次还能执行吗?
你再执行一次看看,还不报错?
if not Exists(select * from sysobjects where name='T_CommandConfig' and xtype='U')
begin
create database CommandConfig
create table CommandConfig.dbo.T_CommandConfig(CODE varchar(30),ADDRESS varchar(30),COM varchar(30))
end--改这样就没问题了
create database CommandConfig
go
if not Exists(select * from sysobjects where name='T_CommandConfig' and xtype='U')
begin
create table CommandConfig.dbo.T_CommandConfig(CODE varchar(30),ADDRESS varchar(30),COM varchar(30))
end要先进行数据库是否存在判断
那个and前面原本是有空格的,后来我改的,不过结果都一样,不行
什么逻辑
如果现在的数据库不存在这个表,你可以直接在当前数据库下建表
而如果你想在另外的数据库里建表,首先你就要判断另外的数据库是否存在,如果已经存在,还要再判断那个数据库是否有这个表
你判断的跟你创建的东西根本都不一样
那么很可能第一次能够正确执行,之后再执行就一定会出错
他第一次确实是创建了这个数据库跟表,按照你的意思确实是思路严谨,但是我这里不写只是因为他重复的几率几乎为零,我图省事就只判断表(PS:这个数据库只有我自己用),现在的问题那个if Exists 判断移到C#中执行不起作用了,我数据库里已经存在T_CommandConfig这个表了,但是他还是执行了创建这个表的语句。我想实现的功能很简单,就是程序启动的时候判断一下这个表存不存在,如果不存在则创建这个表,存在则不用处理。
dbo.T_CommandConfig
把用户名带上,否则默认是检查你连接的用户下是否有这个表,如果其他用户下有这个表,你还是检测不到
但是用if not Exists(select * from sysobjects where name='T_CommandConfig'and xtype='U'查不到结果,但是数据库CommandConfig中不是已经存在这个表了吗,为什么查不到呢
这是那个连接配置connectionString="server=127.0.0.1; uid=sa;password=Dong201127012"/>
稍微总结一下问题所在:最主要的原因在于查询表存不存在时没有指明数据库,所以一直查不到结果,也就一直执行后面的创建语句。
附上最后的代码,仅供参考
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"if not Exists(select * from master.dbo.sysdatabases where name='CommandConfig')
begin
create database CommandConfig
end";
cmd.ExecuteNonQuery();
cmd.CommandText = @"if not Exists(select * from CommandConfig.sys.sysobjects where name='T_CommandConfig'and xtype='U')
begin
create table CommandConfig.dbo.T_CommandConfig(CODE varchar(30),ADDRESS varchar(30),COM varchar(30),BUTERATE varchar(30),PROTOCOL varchar(30),PARITY varchar(30),TYPE varchar(30))
end
if not Exists(select * from CommandConfig.sys.sysobjects where name='T_datagather'and xtype='U')
begin
create table CommandConfig.dbo.T_datagather(DEVICE varchar(30),DATA float,TIME datetime)
end";
cmd.ExecuteNonQuery();
conn.Close();