Поэтому я использую локальную базу данных (.mdf) в Visual Studio 2015. Мне было трудно подключиться к базе данных сначала, но теперь она подключается, насколько я могу судить. Я использую INSERT для добавления данных в базу данных, и у меня также есть переменная, сообщающая мне, если какие-либо строки были затронуты, когда пользователь нажимает кнопку "Сохранить", но каждый раз, когда она говорит об успешном завершении, и я проверяю базу данных, и там ничего нет.
Я искал Google несколько раз об этом ответе, и все говорят использовать SQL Server Management Studio для создания базы данных и предоставления базы данных логического имени. Я сделал это, но когда я пытаюсь добавить эту базу данных в визуальную студию, она говорит, что она дает мне код ошибки 40; и я даже отделил базу данных от сервера и попытался добавить только базу данных, и он говорит, что у нее нет правильных разрешений для нее. Поэтому я не знаю, что делать !!
Вот что я получил до сих пор и надеюсь, что смогу помочь!
Давайте начнем с базы данных:
Название базы данных: dbo.WebLogins
[Id] INT IDENTITY (1,1) NOT NULL,
[Nickname] VARCHAR (50) NULL,
[WebsiteURL] VARCHAR (200) NULL,
[WebsiteUsername] VARCHAR (50) NULL,
[WebsitePassword] VARCHAR (50) NULL,
[WebsiteEmail] VARCHAR (50) NULL,
[WebsiteAbout] VARCHAR (200) NULL,
[WebsiteRating] INT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
Теперь у меня есть текстовые поля и трек-бар и две кнопки:
txtNickname
txtURL
txtUsername
txtEmail
txtPassword
txtPasswordAgain (This just verifies the first password box, doesn't go in db)
txtAbout
tbRating
btnSave
btnCancel
Это мой файл App.Config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFileEntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="PassLock.Properties.Settings.dbMainConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\dbMain.mdf;Initial Catalog=dbMain;Integrated Security=True" providerName="System.Data.SqlClient" />
// NOTE: I ADDED INITIAL CATALOG=dbMain.mdf
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb"/>
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
Теперь код для приложения:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;
using System.Runtime.InteropServices;
namespace PassLock
{
public partial class frmAddSite : Form
{
string connString = ConfigurationManager.ConnectionStrings["dbMainConnectionString"].ConnectionString;
public frmAddSite()
{
InitializeComponent();
}
private void btnSave_Click(object sender, EventArgs e)
{
txtNickname.Enabled = false;
txtPassword.Enabled = false;
txtUrl.Enabled = false;
txtUsername.Enabled = false;
txtEmail.Enabled = false;
txtAbout.Enabled = false;
tbRating.Enabled = false;
cbShowPassword.Enabled = false;
btnSave.Enabled = false;
btnCancel.Enabled = true;
using (SqlConnection con = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand("INSERT INTO WebLogins(Nickname, WebsiteURL, WebsiteUsername, WebsitePassword, WebsiteEmail, WebsiteAbout, WebsiteRating) VALUES (@nickname, @websiteURL, @websiteUsername, @websitePassword, @websiteEmail, @websiteRating)", con);
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
cmd.Parameters.AddWithValue("@nickname", txtNickname.Text);
cmd.Parameters.AddWithValue("@websiteURL", txtURL.Text);
cmd.Parameters.AddWithValue("@websiteUsername", txtUsername.Text);
cmd.Parameters.AddWithValue("@websitePassword", txtPassword.Text);
cmd.Parameters.AddWithValue("@websiteEmail", txtEmail.Text);
cmd.Parameters.AddWithValue("@websiteAbout", txtAbout.Text);
int rating = 0;
if (int.TryParse(tbRating.Text, out rating))
{
cmd.Parameters.Add("@websiteRating", SqlDbType.Int).Value = rating;
}
else
{
cmd.Parameters.Add("@websiteRating", SqlDbType.Int).Value = DBNull.Value;
}
cmd.ExecuteNonQuery();
int iAffectedRecords = cmd.ExecuteNonQuery();
if (iAffectedRecords > 0)
{
MessageBox.Show("successful");
}
else
{
MessageBox.Show("Unsuccessful");
}
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(connString);
if (con.State == ConnectionState.Open)
{
con.Close();
this.Close();
}
else
{
this.Close();
}
}
private void frmAddSite_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(connString);
con.Open();
}
}
}
Надеюсь, все было скопировано правильно, скобки должны быть правильными, я не получаю ошибок в визуальной студии, поэтому все выглядит хорошо. В моем файле Settings.Settings есть следующее:
Имя Тип Объем Значение dbMainConnectionString (ConnectionString) Источник данных приложения = (LocalDB)\MSSQLLocalDB; AttachDbFilename = | DataDirectory |\dbMain.mdf; Начальный каталог = dbMain; Integrated Security = True
У меня также есть DataSet, который называется dbMainDataSet.xsd, который обладает следующими свойствами:
Build Action: None
Copy to: Do not copy
Custom Tool: MSDataSetGenerator
Custom Tool Namespace:
File Name: dbMainDataSet.xsd
Full Path: C:\Users\Andy\Documents\Visual Studio 2015\Projects\PassLock\PassLock\dbMainDataSet.xsd
И моя база данных (dbMain.mdf) обладает следующими свойствами:
Build Action: None
Copy to: Copy always
Custom Tool:
Custom Tool Namespace:
Full Name: dbMain.mdf
Full Path: C:\Users\Andy\Documents\Visual Studio 2015\Projects\PassLock\PassLock\dbMain.mdf
Я не знаю, если это имеет значение или нет, но когда я перехожу в Advanced Properties, это то, что я получаю:
Advanced:
MultipleActiveResult False
Network Library
Packet Size 8000
Transaction Binding Implicit Unbind
Type System Version Latest
Connection Resiliency
ConnectRetryCount 1
ConnectRetryInterval 10
Context
Application Name .NET SqlClient Data Provider
Workstation ID
Initialization
ApplicationIntent ReadWrite
Asynchronous Process False
Connect Timeout 15
Current Language
Pooling
Enlist True
Load Balance Timeout 0
Max Pool Size 100
Min Pool Size 0
Pooling True
Replication
Replication False
Security
Encrypt False
Integrated Security True
Password
Persist Security Info False
TrustServerCertificate False
User ID
Source
AttachDbFilename C:\Users\Andy\Documents\Visual Studio 2015\Projects\PassLock\PassLock\dbMain.mdf
Context Connection False
Data Source (LocalDB)\MSSQLLocalDB
Failover Partner
Initial Catalog
MultiSubnetFailover False
User Instance False
И в Modify Connection это:
Data Source: Microsoft SQL Server Database File (SqlClient)
Database File Name (new or existing): Visual Studio 2015\Projects\PassLock\PassLock\dbMain.mdf
Log On to the server: Use Windows Authentication
When I test the connection it is successful
В файле package.config:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="EntityFramework" version="6.1.2-beta1" targetFramework="net45" />
</packages>
И последнее, но не менее важное: файл Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PassLock
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
}
}
Я также использую тему в своем приложении, но текстовые поля - это обычные текстовые поля, которые поставляются с визуальной студией.
Я не уверен, нужна ли вам вся эта информация, но я видел кучу сообщений, в которых люди говорят, что им нужна дополнительная информация, поэтому я дал вам все это и, надеюсь, кто-то может помочь!
вы также можете сохранить свою учетную информацию на локальном диске вместо базы данных. Но убедитесь, что информация должна быть зашифрована, иначе кто-то может взломать вашу учетную информацию. вы можете разделить информацию на несколько частей и сохранить ее в другом файле. как он будет более безопасным, и есть меньше возможностей взломать вашу систему.
В вашем исключении проблема аутентификации. пожалуйста, предоставьте более подробную информацию об исключении.
EDITED: Вы говорили, что приложение can't connect the sql server
. Но ошибка говорит о том, что вы назначаете недопустимое значение параметра типа. В соответствии с вашим сообщением об ошибке проблема может быть в вашем последнем параметре. вы назначаете string
значение в параметре integer
типа данных. вы должны преобразовать значение в integer
тип данных. если textbox
пустое или пустое, значения параметра должны быть DBNull.Value
.
Вы можете сделать это.
int rating = 0;
if (int.TryParse(tbRating.Text, out rating))
cmd.Parameters.AddWithValue("@websiteRating", rating);
else
cmd.Parameters.AddWithValue("@websiteRating", DbNull.Value);
или
int rating = 0;
if (int.TryParse(tbRating.Text, out rating))
cmd.Parameters.Add("@websiteRating", SqlDbType.Int).Value = rating;
else
cmd.Parameters.Add("@websiteRating", SqlDbType.Int).Value = DBNull.Value;
int.TryParse
метод попытается преобразовать string
переменной в integer
типа данных. если значение пустое или имеет нечисловой символ, то он не сможет преобразовать, тогда условие вернет false
.
int iAffectedRecords = cmd.ExecuteNonQuery();
if (iAffectedRecords > 0)
{
//Record successfully saved.
}
Если в переменной iAffectedRecords
значение больше 0
это означает, что запись вставлена или обновлена в базе данных.
Попробуйте использовать обычную строку соединения с вашими учетными данными. Убедитесь, что учетные данные работают. Получите ваш код, работающий с палкой, что строка в App.config
<add name="PassLock.Properties.Settings.dbMainConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\dbMain.mdf; Integrated Security=True" providerName="System.Data.SqlClient" />
Похоже, это сработает или мне нужно что-то изменить? Кроме того, есть ли что-то еще в коде, который должен быть введен в действие?
connString
? Вы можете подключиться с теми же учетными данными в SSMS?try/catch/throw/finally
и замените его, поместив соединение в блокusing
.