База данных подключится, но данные не могут быть вставлены

1

Поэтому я использую локальную базу данных (.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());
          }
     }
}

Я также использую тему в своем приложении, но текстовые поля - это обычные текстовые поля, которые поставляются с визуальной студией.

Я не уверен, нужна ли вам вся эта информация, но я видел кучу сообщений, в которых люди говорят, что им нужна дополнительная информация, поэтому я дал вам все это и, надеюсь, кто-то может помочь!

  • 0
    Как выглядит ваш connString ? Вы можете подключиться с теми же учетными данными в SSMS?
  • 0
    Во-первых, избавьтесь от этого try/catch/throw/finally и замените его, поместив соединение в блок using .
Показать ещё 2 комментария
Теги:
database
winforms

2 ответа

1

вы также можете сохранить свою учетную информацию на локальном диске вместо базы данных. Но убедитесь, что информация должна быть зашифрована, иначе кто-то может взломать вашу учетную информацию. вы можете разделить информацию на несколько частей и сохранить ее в другом файле. как он будет более безопасным, и есть меньше возможностей взломать вашу систему.

В вашем исключении проблема аутентификации. пожалуйста, предоставьте более подробную информацию об исключении.

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 это означает, что запись вставлена или обновлена в базе данных.

  • 0
    Я думаю, что то, что вы говорите, было бы лучше всего сделать в моем случае, я не могу заставить работать базу данных! Есть хороший учебник, о котором вы знаете? Я собираюсь найти его и посмотреть, что я могу найти, просто чтобы посмотреть, какие у меня есть варианты.
  • 0
    @ И я отредактировал свой ответ, пожалуйста, посмотрите. Вы говорили, что приложение не может подключиться к серверу. но ошибка показывает, что вы назначаете неверное значение типа параметра.
Показать ещё 3 комментария
0

Попробуйте использовать обычную строку соединения с вашими учетными данными. Убедитесь, что учетные данные работают. Получите ваш код, работающий с палкой, что строка в App.config

  • 0
    С локальной базой данных на основе сервисов (я думаю, что так они и называются) это файл .mdf, я не установил никаких учетных данных. Если я использую базу данных другого типа в VS, будет ли она храниться на компьютере пользователя? <add name="PassLock.Properties.Settings.dbMainConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\dbMain.mdf; Integrated Security=True" providerName="System.Data.SqlClient" /> Похоже, это сработает или мне нужно что-то изменить? Кроме того, есть ли что-то еще в коде, который должен быть введен в действие?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню