所以我在Visual Studio 2015中使用本地数据库(.mdf)。我最初很难连接到数据库,但现在它已连接到我所知道的。我正在使用INSERT将数据添加到数据库中,并且我还有一个变量告诉我,一旦用户单击“保存”按钮,是否有任何行受到影响,但每次它说成功并且我检查数据库并且没有任何内容。
我已经多次搜索Google这个答案,每个人都说使用SQL Server Management Studio创建数据库并为数据库提供逻辑名称。我这样做了,但是当我尝试将该数据库添加到visual 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)Application Data Source =(LocalDB)\ MSSQLLocalDB; AttachDbFilename = | DataDirectory | \ dbMain.mdf; Initial Catalog = dbMain; Integrated Security = True
我还有一个名为dbMainDataSet.xsd的DataSet,它具有以下属性:
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:
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
在修改连接下,它是:
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
在packages.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());
}
}
}
我也在我的应用程序中使用主题,但文本框是visual studio附带的普通文本框。
我不确定您是否需要所有这些信息,但我看到一些帖子,人们说他们需要更多信息,所以我给了你一切,希望有人可以提供帮助!
答案 0 :(得分:1)
您还可以将凭据信息存储在本地驱动器而不是数据库中。但是,请确保信息必须加密,否则任何人都可以破解您的凭据信息。您可以将信息拆分为多个部分并将其存储在不同的文件中。如何更安全,破解你的系统的可能性更小。
在您的例外中,它似乎是身份验证问题。请提供有关例外的更多详细信息。
已编辑:您说的是应用can't connect the sql server
。但是,错误是说您正在分配无效的类型参数值。根据您的错误消息,问题可能出在您的上一个参数中。您在string
数据类型参数中分配integer
值。您应该将值转换为integer
数据类型。如果textbox
为空或为null,则参数值应为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.
}
如果在0
变量中获得的值超过iAffectedRecords
,则表示在数据库中插入或更新了记录。
答案 1 :(得分:0)
尝试使用带有凭据的常规连接字符串。确保凭据有效。让您的代码在App.config
中使用该字符串