我现在把写好的项目进行打包,安装打包程序后,点击快捷方式,出现“用户‘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);//开始创建数据库
}
}
}
我写的安装程序类代码如下:
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);//开始创建数据库
}
}
}
个人看法:
需要知道要运行你软件的计算机的sqlserver安装位置,把你的sql数据库复制到sqlserver的DATA目录下,当然这个“复制”,要在你的安装程序里用代码实现,也就是说自己写安装程序。
点击快捷方式,出现“用户‘sa’登录失败” //运行程序时出现问题,说明打包没有问题,程序中使用了错误的密码了吧。连接字符串是放到config文件中了吗?如果是,可以修改;如果不是,只能改源代码了。
你是不是可以在安装的时候弹出界面,让用户自己创建一个user,然后给这个user权限到你的database上
你的程序是怎么知道sa密码的,hard-code还是让用户输入?
SqlDataAdapter sda = new SqlDataAdapter("select * from tb_emp", conn);
DataSet ds = new DataSet();
sda.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];然后,我对程序进行打包,打包的时候我在用户界面那出现了一个对话框,让用户输入服务器名,数据库名,用户名,和密码。然后安装程序类的代码就是我最上面发的,还有现在突然想到一个问题啊,如何用户在安装到他的计算机上,输入的用户名和密码不是“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);
}
{
conn.Open();
...
}
SqlConnection conn = new SqlConnection("server=.;database=db_15;uid=sa;pwd=123");
你这样写,不管用户输入什么都没用了,因为你根本就没有使用用户输入的 用户名和密码
只有一种情况你得程序是能用的,就是客户的sql数据库装在本机,并且sa的密码是123,其它情况都会报错
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登录失败检查连接字符串,自定义界面中连接字符串配置
打包到别的机器上,服务器路径就不同,可能是本机,也可能是远程服务器,甚至是不同的数据库名要学学使用配置文件了,别把链接写死在程序里,万一要换服务器,换用户名换密码呢?//配置文件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();
去配置文件里读取
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("数据库创建成功");
}
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("数据库创建成功");
}
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修改后的程序给你发过去了。
这个原因应该是 密码不对把 安装的时候要用户自己填写账号密码 要不就考虑windows验证