Я создаю приложение, первое окно которого является окном конфигурации базы данных.В этом окне пользователь вводит подробную информацию о сервере и выбирает базу данных, которую он хочет использовать, для которой информация о соединении с базой данных и переносится в окно входа в систему и открывание окна.
Вход в систему и последующие окна используют базу данныхдетали для их строки подключения sql.
Мой вопрос здесь такой: как я могу сохранить эти детали подключения из окна конфигурации, чтобы пользователь обошел этот экран, если он уже установил предыдущее соединение?У меня есть идея сохранить эти данные в файле и установить логическое условие в App.xaml.cs, но я не знаю, как это сделать.
Вот мой код:
Для окна настроек базы данных
DatabaseSettings.xaml.cs
private void btnTest_Click(object sender, RoutedEventArgs e)
{
try
{
connectionString = "Data Source = " + txtServer.Text + "; User Id = " + txtUserID.Text + "; Password = " + txtPassword.Password + "";
conn = new SqlConnection(connectionString);
conn.Open();
string message = "Connection Successful Please Select a Database to Proceed";
string caption = "Success!";
MessageBoxButton buttons = MessageBoxButton.OK;
MessageBoxImage icon = MessageBoxImage.Information;
System.Windows.MessageBox.Show(message, caption, buttons, icon);
txtServer.IsEnabled = false;
txtUserID.IsEnabled = false;
txtPassword.IsEnabled = false;
btnTest.IsEnabled = false;
cmbdatabase.IsEnabled = true;
btnConfigure.IsEnabled = true;
btnConfigure.IsDefault = true;
sql = "EXEC sp_databases";
command = new SqlCommand(sql, conn);
reader = command.ExecuteReader();
cmbdatabase.Items.Clear();
while (reader.Read())
{
cmbdatabase.Items.Add(reader[0].ToString());
}
conn.Close();
}
catch(Exception ex)
{
System.Windows.MessageBox.Show("Error: " + ex);
}
}
static string Encrypt_Password(string value)
{
using (SHA256Managed sha2 = new SHA256Managed())
{
UTF8Encoding uTF8 = new UTF8Encoding();
byte[] data = sha2.ComputeHash(uTF8.GetBytes(value));
return Convert.ToBase64String(data);
}
}
private void btnConfigure_Click(object sender, RoutedEventArgs e)
{
try
{
string selected = cmbdatabase.Text;
txtSelectedDBItem.Text = cmbdatabase.Text;
string EncryptedPassword = Encrypt_Password(txtPassword.Password);
connectionString = "Data Source = " + txtServer.Text + "; Initial Catalog = " + selected + "; User Id = " + txtUserID.Text + "; Password = " + txtPassword.Password + "";
conn = new SqlConnection(connectionString);
sql = "INSERT INTO Proc_Activity_Log ([UserName], [Password], [AccessTime], [MachineSerial]) values(@userId, @password, @accessTime, @machineserial)";
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@userID", txtUserID.Text);
cmd.Parameters.AddWithValue("@password", EncryptedPassword);
cmd.Parameters.AddWithValue("@accessTime", dateTime.Text);
cmd.Parameters.AddWithValue("@machineserial", txtMachineSerialNo.Text);
cmd.ExecuteNonQuery();
}
UserInterface.frmLogin loginScreen = new UserInterface.frmLogin(txtUserID.Text, txtPassword.Password, txtServer.Text, txtSelectedDBItem.Text);
spashScreen.Show();
this.Close();
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("Error Here:" + ex.Message);
}
}
Для экрана входа в систему
frmLogin.xaml.cs
public frmLogin(string uname, string pwd, string server, string db)
{
InitializeComponent();
txtServerUser.Text = uname;
txtServerPwd.Password = pwd;
txtServer.Text = server;
txtSelectedDBItem.Text = db;
}
private void btnOk_Click(object sender, EventArgs e)
{
SqlConnection sqlCon = new SqlConnection(@"Data Source=" + txtServer.Text + "; Initial Catalog=" + txtSelectedDBItem.Text + "; Integrated Security=True;");
try
{
if (sqlCon.State == ConnectionState.Closed)
sqlCon.Open();
String query = "SELECT COUNT(1) FROM dbo.users WHERE name=@Username and password=@Password";
SqlCommand sqlCmd = new SqlCommand(query, sqlCon);
sqlCmd.CommandType = CommandType.Text;
sqlCmd.Parameters.AddWithValue("@Username", txtLogin.Text);
sqlCmd.Parameters.AddWithValue("@Password", txtPwd.Password);
int count = Convert.ToInt32(sqlCmd.ExecuteScalar());
if (count == 1)
{
frmMDI yourDesktop = new frmMDI(txtLogin.Text, txtServerUser.Text, txtServerPwd.Password, txtServer.Text, txtSelectedDBItem.Text);
yourDesktop.Show();
this.Close();
}
else
{
txtLogin.Text = "admin";
txtPwd.Password = "admin";
txtLogin.Focus();
}
}
catch (Exception ex)
{
string message = "The Following Error Occurred: " + ex.Message;
string caption = "Invalid Action";
MessageBoxButton buttons = MessageBoxButton.OK;
MessageBoxImage icon = MessageBoxImage.Error;
System.Windows.MessageBox.Show(message, caption, buttons, icon);
}
finally
{
sqlCon.Close();
}
}
Из приведенных ниже снимков экрана можно сделать вывод, какие кнопки представляют события щелчка в приведенном выше коде
Окно настроек базы данных - тестирование соединения
Окно настроек базы данных - тестирование соединения
Окно настроек базы данных - Настройка базы данных
Окно настроек базы данных - Настройка базы данных
И, наконец, окно входа в систему
окно входа