小弟主要想实现创建帐套的功能,让用户输入数据库名称、路径两个参数,然后在创建;
下面是让用户输入一个数据库参数的代码,把所有的参数用字符串代替就可以执行成功并创建数据库,
到代参数就失败了,不知哪里错了;请各位大侠多多帮助初学者,最好有实例或更好的方法,E_MAIL:[email protected],分数不够再加,多谢!
try
{
this.Cursor=Cursors.WaitCursor;
         mycmd=mycnc.CreateCommand();
mycmd.CommandText=@"use master create database @dbname on primary (name=@dbname1,filename='D:\Program Files\Microsoft SQL Server\MSSQL\Data\@dbname2',size=5mb, maxsize=10mb, filegrowth=5%)  log on (name=@dbname3, filename='D:\Program Files\Microsoft SQL Server\MSSQL\Data\@dbname4',size=1mb)";
mycmd.Parameters.Add("@dbname",SqlDbType.VarChar,50);
mycmd.Parameters.Add("@dbname1",SqlDbType.VarChar,50);
mycmd.Parameters.Add("@dbname2",SqlDbType.VarChar,50);
mycmd.Parameters.Add("@dbname3",SqlDbType.VarChar,50);
mycmd.Parameters.Add("@dbname4",SqlDbType.VarChar,50);
mycmd.Parameters["@dbname"].Value=this.textBox1.Text;
mycmd.Parameters["@dbname1"].Value=this.textBox1.Text+"_dat";
mycmd.Parameters["@dbname2"].Value=this.textBox1.Text+".mdf";
mycmd.Parameters["@dbname3"].Value=this.textBox1.Text+"_log";
mycmd.Parameters["@dbname4"].Value=this.textBox1.Text+".ldf";
int result=mycmd.ExecuteNonQuery();
this.Cursor=Cursors.Default;
return;}
catch
{
  MessageBox.Show("Fait");
this.Cursor=Cursors.Default;
return ;}
还有:use master 
if not exists (select * from sysobjects where name='credb')
begin
create proc dbo.credb 
@dbname varchar(20),
@dbname1 varchar(20),
@dbname2 varchar(20),
@dbname3 varchar(20),
@dbname4 varchar(20)
as
exec('create database '+@dbname+'  on primary(name='+@dbname1+',filename='+@dbname2+',size=5mb,maxsize=10mb,filegrowth=5%)'+
'log on (name='+@dbname3+',filename='+@dbname4+',size=1mb)')
end为什么执行整个语句失败,单独执行BEGIN..END 之间的语句就可以成功;
提示错误:“服务器: 消息 156,级别 15,状态 1,行 4
在关键字 'proc' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 11
必须声明变量 '@dbname'。
请各位高手指教,感谢!分数不够可以再加!”

解决方案 »

  1.   

    将你的语句:
    use master 
    if not exists (select * from sysobjects where name='credb')
    begin
        ....
    end
    改为:
    use master 
    if exists (select * from sysobjects where name='credb')
    begincreate proc dbo.credb 
    @dbname varchar(20),
    @dbname1 varchar(20),
    @dbname2 varchar(20),
    @dbname3 varchar(20),
    @dbname4 varchar(20)
    as
    exec('create database '+@dbname+'  on primary(name='+@dbname1+',filename='+@dbname2+',size=5mb,maxsize=10mb,filegrowth=5%)'+
    'log on (name='+@dbname3+',filename='+@dbname4+',size=1mb)')
    end
    go
        Drop procedure credb
    end
    go
      

  2.   

    还有在创建数据库的Sql语句中数据库名称和其他的一些值不能用参数来传递,直接写到代码中吧如:
    mycmd.CommandText=@"use master create database @dbname on primary (name='youDBName',filename='D:\Program Files\Microsoft SQL Server\MSSQL\Data\dbname2',size=5mb, maxsize=10mb, filegrowth=5%)  log on (name=dbname3, filename='D:\Program Files\Microsoft SQL Server\MSSQL\Data\dbname4',size=1mb)";
    不能使用:
    mycmd.Parameters.Add("@dbname",SqlDbType.VarChar,50);