数据库将连接但不能插入数据

时间:2015-01-17 03:21:49

标签: c# database winforms

所以我在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附带的普通文本框。

我不确定您是否需要所有这些信息,但我看到一些帖子,人们说他们需要更多信息,所以我给了你一切,希望有人可以提供帮助!

2 个答案:

答案 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

中使用该字符串