我现在把写好的项目进行打包,安装打包程序后,点击快捷方式,出现“用户‘sa’登录失败”,找了好长时候不知道问题出在哪,请大家帮忙看看,
我写的安装程序类代码如下:
namespace SetUpDB
{
    [RunInstaller(true)]
    public partial class Installer1 : Installer
    {
        public Installer1()
        {
            InitializeComponent();
        }
       
        private   void  CreateDataBase( string  strSql, string  DataName,  string  strMdf,  string  strLdf, string  path)
        { 
            SqlConnection myConn = new SqlConnection(strSql); 
            String str = null ; 
            try   
            {     
                str = " EXEC sp_attach_db @dbname='"+DataName+"',@filename1='"+strMdf+"',@filename2='"+strLdf+"'";  
                SqlCommand myCommand = new SqlCommand(str, myConn);  
                myConn.Open();   
                myCommand.ExecuteNonQuery();   
                //MessageBox.Show("数据库安装成功!点击确定继续");//需Using System.Windows.Forms 
            }   
            catch(Exception e)
            {   
                //MessageBox.Show("数据库安装失败!" + e.Message+"\n\n"+"您可以手动附加数据"); 
                System.Diagnostics.Process.Start(path);
            }  
            finally  
            {     
                myConn.Close();  
            }
        }
        public override void Install(System.Collections.IDictionary stateSaver)
        {   string server = this.Context.Parameters["server"];//服务器名称  
            string uid = this.Context.Parameters["user"];//SQlServer用户名 
            string pwd = this.Context.Parameters["pwd"];//密码    
            string path = this.Context.Parameters["targetdir"];//安装目录 
            string strSql = "server=" + server + ";uid=" + uid + ";pwd=" + pwd + ";database=master";//连接数据库字符串  
            string DataName = "db_15";//数据库名 
            string strMdf = path + @"db_15.mdf";//MDF文件路径,
            string strLdf = path + @"db_15_log.ldf";//LDF文件路径  
            base.Install(stateSaver);  
            this.CreateDataBase(strSql, DataName, strMdf, strLdf, path);//开始创建数据库
        }  
    }
}

解决方案 »

  1.   

    提示的多清楚啊..你目标SQL服务器的SA密码不对...如果是本机安装.你可以考虑使用WINDOWS身份登陆.
      

  2.   

    好像不可以吧,使用sql数据库,要在目标计算机上安装sql服务器,然后把你的sql数据库附加进去
    个人看法:
    需要知道要运行你软件的计算机的sqlserver安装位置,把你的sql数据库复制到sqlserver的DATA目录下,当然这个“复制”,要在你的安装程序里用代码实现,也就是说自己写安装程序。
      

  3.   

    就是登录失败。如果是单机版可以access。。
      

  4.   

    如果想一起附带进去,安全性要求不是很高,功能不是很复杂,还可以考虑access数据库
      

  5.   

    不对我现在把写好的项目进行打包,安装打包程序后,// 看起来安装已经成功了
    点击快捷方式,出现“用户‘sa’登录失败” //运行程序时出现问题,说明打包没有问题,程序中使用了错误的密码了吧。连接字符串是放到config文件中了吗?如果是,可以修改;如果不是,只能改源代码了。
      

  6.   

    大家好,可能我说的不是很清楚,程序本身运行的时候是可以连接数据库的,很正常。当我打包后,然后运行我打包后在桌面出现的快捷方式,就会出现“用户 sa登录失败”,不知道是不是我的代码有问题,还是其他原因,不过我的数据库用户"SA"的密码是正确的,请大家在帮我看一下,或者有没有具体的打包资料也可以,我是第一次做打包,很多不是很了解,谢谢
      

  7.   

    创建数据库时弹出界面,让用户输入用户名和密码,然后创建这个user,然后再赋予这个user权限到你要创建的数据库上
      

  8.   

    这个就是说明程序在你打包发布的机器上运行不正常,你打包的机器上的数据库的sa的密码对么?
    你是不是可以在安装的时候弹出界面,让用户自己创建一个user,然后给这个user权限到你的database上
    你的程序是怎么知道sa密码的,hard-code还是让用户输入?
      

  9.   

    rabbitlzx 朋友,我是初次做打包,情况是这样的,不知道我的思路是否正确,我程序上有一个DATAGRIDVIEW 然后绑定到数据库,其中部分代码是这样的:            SqlConnection conn = new SqlConnection("server=.;database=db_15;uid=sa;pwd=123");
               SqlDataAdapter sda = new SqlDataAdapter("select * from tb_emp", conn);
               DataSet ds = new DataSet();
               sda.Fill(ds);
               dataGridView1.DataSource = ds.Tables[0];然后,我对程序进行打包,打包的时候我在用户界面那出现了一个对话框,让用户输入服务器名,数据库名,用户名,和密码。然后安装程序类的代码就是我最上面发的,还有现在突然想到一个问题啊,如何用户在安装到他的计算机上,输入的用户名和密码不是“sa”和“123”的话,那岂不是程序会报错啊,我现在有点乱了,请求帮助,谢谢
      

  10.   

    你这是全写死了,如果用户的sql数据库装在别的机器上呢?或者像你说的那样他输入的不是sa和123呢,都会报错的
                   bool bSqlAuth = rbSqlAuth.Checked; //一个checkbox,是否使用sql验证,就像query analyze登录界面似的
                string database = tbDatabase.Text;
                string serverName = tbServerName.Text;            //这里要对用户输入的进行验证,如检测用户名是否为空            if (bSqlAuth)
                {
                    connectionString = string.Format("Server={0}; Database={1}; User ID={2}; Password={3}; Connection Timeout=5", serverName, database, tbUserName.Text, tbPassword.Text);
                }
                else
                {
                    connectionString = string.Format("Server={0};integrated security=SSPI;database={1}", serverName, database);
                }
      

  11.   

    对于你的情况,string database = tbDatabase.Text;可以省略了,应该就是db_15using (SqlConnection conn = new SqlConnection(connectionString))
    {
       conn.Open();
       ...
    }
      

  12.   

    我也搞晕菜了
    SqlConnection conn = new SqlConnection("server=.;database=db_15;uid=sa;pwd=123");
    你这样写,不管用户输入什么都没用了,因为你根本就没有使用用户输入的 用户名和密码
    只有一种情况你得程序是能用的,就是客户的sql数据库装在本机,并且sa的密码是123,其它情况都会报错
      

  13.   

    sql Server 配置 没有启动 TCP/IP??
      

  14.   

    你发布的机器上sql数据库 sa的密码是什么?
      

  15.   

    安装部署中附加数据库或执行SQL创建数据
    use master exec sp_attach_db @dbname=N'数据库名 ',@filename1=N'数据库文件地址',@filename2=N'日志文件地址'
    installshield安装脚本 
     
    安装部署中install添加自定义操作
    设置文本框属性值
    如Context.Parameters["targetdir"]  
    private void ExecuteSql(string connString,string DatabaseName,string sql)
    {
    using(SqlConnection conn=new SqlConnection(connString))
    {
    SqlCommand cmd=new SqlCommand(sql,conn);
    conn.Open();
    cmd.Connection.ChangeDatabase(DatabaseName);
    cmd.ExecuteNonQuery();
    conn.Close();
    }
    }
    string connString=string.Format("server={0};user id={1};password={2}",this.Context.Parameters["server"],this.Context.Parameters["user"],this.Context.Parameters["pwd"]);//根据输入的数据库名称建立数据库
    ExecuteSql(connString,"master","create database "+this.Context.Parameters["dbname"]);//调用osql执行脚本
    string cmd=string.Format(" -S{0} -U{1} -P{2} -d{3} -i{4}db.sql",this.Context.Parameters["server"],this.Context.Parameters["user"],this.Context.Parameters["pwd"],this.Context.Parameters["dbname"],this.Context.Parameters["targetdir"]);
    System.Diagnostics.Process sqlProcess=new Process();
    sqlProcess.StartInfo.FileName="osql.exe";
    sqlProcess.StartInfo.Arguments=cmd;
    sqlProcess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
    sqlProcess.Start();
    sqlProcess.WaitForExit();//等待执行
    sqlProcess.Close();
    sa登录失败检查连接字符串,自定义界面中连接字符串配置
      

  16.   

    呵呵,是发布打本机上,不过我现在把db——15手动附加到数据库上,运行我打包后出现的快捷方式正常,但是我把数据库从服务器上删掉,然后重新安装我打包的程序,然后点击出现的快捷方式,会出现“无法登陆db—15中请求的数据库,登陆失败”,出现这个是不是我的安装程序类写的代码有误啊,谢谢大家
      

  17.   

    rabbitlzx  朋友,您好,我用你的方法试了一下,现在的情况是数据库现在把db——15手动附加到数据库上,运行我打包后出现的快捷方式正常,但是我把数据库从服务器上删掉,然后重新安装我打包的程序,然后点击出现的快捷方式,会出现“无法登陆db—15中请求的数据库,登陆失败”,这个是不是在我上面写的安装程序类有误呀,我打开我的服务器,也发现db_15也没有附加进去,朋友帮我看一下啊,谢谢
     
      

  18.   

    请用配置文件来做!
    打包到别的机器上,服务器路径就不同,可能是本机,也可能是远程服务器,甚至是不同的数据库名要学学使用配置文件了,别把链接写死在程序里,万一要换服务器,换用户名换密码呢?//配置文件app.config里写连接信息,如果ASP.ENT则用web.config
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="ConnectionString" value="server=.;database=Test;uid=sa;pwd=;"/>
      </appSettings>
    </configuration>//然后你的程序里连接数据库,从配置文件去读ConnectionString这个key的连接信息
    string connectionString = ConfigurationManager.AppSettings["ConnectionString"].ToString();
      

  19.   

    你的  str = " EXEC sp_attach_db @dbname='"+DataName+"',@filename1='"+strMdf+"',@filename2='"+strLdf+"'";  换成 str = ConfigurationManager.AppSettings["ConnectionString"].ToString();
    去配置文件里读取
      

  20.   

    你安装数据库是一个单独的应用程序么,可以调试么?如果有界面可以在界面上加一个listbox,然后log一些信息,比如创建到哪一步 结果如何 这样能便于你查找错误
    private string m_server; // sql server机器名
    private string m_username; // sa
    private string m_password; // sa密码SqlConnection m_connection = new SqlConnection();
    try
    {
    if ( m_username == null || m_username == string.Empty )
    {
    m_connection.ConnectionString = string.Format("Data Source={0};Integrated Security=SSPI;Trusted_Connection=yes", m_server ); }
    else
    {
    m_connection.ConnectionString = string.Format("Data Source={0};Integrated Security=false; User ID={1};Password={2}",
    m_server, m_username, m_password );
    } listbox1.Items.Add("准备连接……" );
    m_connection.Open();
    listbox1.Items.Add( "连接已打开");
                }
                catch( Exception excep )
    {
    ...
    // 创建数据库
    private void CreateDb(string dbName ) // dbName = db_15
    {
    //CREATE DATABASE Sales
    //ON 
    //( NAME = Sales_dat,
    //   FILENAME = 'c:\program files\microsoft sql server\mssql\data\saledat.mdf',
    //   SIZE = 10,
    //   MAXSIZE = 50,
    //   FILEGROWTH = 5 )
    //LOG ON
    //( NAME = 'Sales_log',
    //   FILENAME = 'c:\program files\microsoft sql server\mssql\data\salelog.ldf',
    //   SIZE = 5MB,
    //   MAXSIZE = 25MB,
    //   FILEGROWTH = 5MB ) m_connection.ChangeDatabase("master"); string datafile = @"C:\Program Files\Microsoft SQL Server\MSSQL\Data\db_15_data.mdf";
    string logfile = @"C:\Program Files\Microsoft SQL Server\MSSQL\Data\db_15_log.ldf"; listbox1.Items.Add("开始创建新数据库……") ); StringBuilder sb = new StringBuilder();
    sb.Append("CREATE DATABASE "  + dbName  + Environment.NewLine );
    sb.Append("ON "  + Environment.NewLine );
    sb.Append("( NAME = "  + dbName  + "_dat," + Environment.NewLine);
    sb.Append("  FILENAME = '"  + datafile + "'," + Environment.NewLine);
    sb.Append("  SIZE = 2MB," + Environment.NewLine);
    sb.Append("  MAXSIZE = UNLIMITED,"  + Environment.NewLine);
    sb.Append("  FILEGROWTH = 10% )" + Environment.NewLine);
    sb.Append("LOG ON "  + Environment.NewLine);
    sb.Append("( NAME = "  + dbName  + "_log," + Environment.NewLine);
    sb.Append("  FILENAME = '"  + logfile + "'," + Environment.NewLine);
    sb.Append("  SIZE = 1MB," + Environment.NewLine);
    sb.Append("  MAXSIZE = UNLIMITED,"  + Environment.NewLine);
    sb.Append("  FILEGROWTH = 10% )" + Environment.NewLine); SqlCommand cmd = new SqlCommand( sb.ToString(), m_connection );
    cmd.CommandTimeout = 0;
    cmd.ExecuteNonQuery();

    listbox1.Items.Add("数据库创建成功");
    }
      

  21.   

    创建数据库
    private string m_server; // sql server机器名
    private string m_username; // sa
    private string m_password; // sa密码SqlConnection m_connection = new SqlConnection();
    try
    {
    if ( m_username == null || m_username == string.Empty )
    {
    m_connection.ConnectionString = string.Format("Data Source={0};Integrated Security=SSPI;Trusted_Connection=yes", m_server );}
    else
    {
    m_connection.ConnectionString = string.Format("Data Source={0};Integrated Security=false; User ID={1};Password={2}",
    m_server, m_username, m_password );
    }listbox1.Items.Add("准备连接……" );
    m_connection.Open();
    listbox1.Items.Add( "连接已打开");
      }
      catch( Exception excep )
    {
    ...
    // 创建数据库
    private void CreateDb(string dbName ) // dbName = db_15
    {
    //CREATE DATABASE Sales
    //ON 
    //( NAME = Sales_dat,
    // FILENAME = 'c:\program files\microsoft sql server\mssql\data\saledat.mdf',
    // SIZE = 10,
    // MAXSIZE = 50,
    // FILEGROWTH = 5 )
    //LOG ON
    //( NAME = 'Sales_log',
    // FILENAME = 'c:\program files\microsoft sql server\mssql\data\salelog.ldf',
    // SIZE = 5MB,
    // MAXSIZE = 25MB,
    // FILEGROWTH = 5MB )m_connection.ChangeDatabase("master");string datafile = @"C:\Program Files\Microsoft SQL Server\MSSQL\Data\db_15_data.mdf";
    string logfile = @"C:\Program Files\Microsoft SQL Server\MSSQL\Data\db_15_log.ldf";listbox1.Items.Add("开始创建新数据库……") );StringBuilder sb = new StringBuilder();
    sb.Append("CREATE DATABASE " + dbName + Environment.NewLine );
    sb.Append("ON " + Environment.NewLine );
    sb.Append("( NAME = " + dbName + "_dat," + Environment.NewLine);
    sb.Append(" FILENAME = '" + datafile + "'," + Environment.NewLine);
    sb.Append(" SIZE = 2MB," + Environment.NewLine);
    sb.Append(" MAXSIZE = UNLIMITED," + Environment.NewLine);
    sb.Append(" FILEGROWTH = 10% )" + Environment.NewLine);
    sb.Append("LOG ON " + Environment.NewLine);
    sb.Append("( NAME = " + dbName + "_log," + Environment.NewLine);
    sb.Append(" FILENAME = '" + logfile + "'," + Environment.NewLine);
    sb.Append(" SIZE = 1MB," + Environment.NewLine);
    sb.Append(" MAXSIZE = UNLIMITED," + Environment.NewLine);
    sb.Append(" FILEGROWTH = 10% )" + Environment.NewLine);SqlCommand cmd = new SqlCommand( sb.ToString(), m_connection );
    cmd.CommandTimeout = 0;
    cmd.ExecuteNonQuery();listbox1.Items.Add("数据库创建成功");
    }
      

  22.   

    修改了几个地方:
    1. setup 工程的Custom Action的CustomActionData做了修改,传递GUI上的值到Install Class中。参考我给你的连接2. InstallClass中的Install函数中的mdf文件名写错了,应该是db_15_Data.MDF,而不是db_15.MDF4. 在ShowData中将连接字符串保存到config。并在运行时读取。3. 在InstallClass中修改config文件中的ConnectionString修改后的程序给你发过去了。
      

  23.   

    关注下 .. 曾经自己弄项目 写过一个mssql数据库的添加分离恢复的小程序..很方便.
    这个原因应该是 密码不对把 安装的时候要用户自己填写账号密码 要不就考虑windows验证
      

  24.   

    在此,特别感谢findcaiyzh ,感谢rabbitlzx 、sdcpzzg 等等 感谢所有帮我解答的朋友,因为你们的帮助,我会进步更快,在一次感谢大家,结贴,散分~~