2016-03-20 5 views
1

Als ich lernte, ursprünglich zu programmieren, wurde mir gesagt, dass es 3 mögliche Ergebnisse gab; Es gab einen Fehler, es funktionierte oder es passierte nichts.Verwenden von INSERT Prozedur mit SQL Server

Ich habe die letzte das Problem im Moment und es gibt keine Fehlermeldung für mich zu übermitteln. Hier

ist das Fenster Form:

screenshot of windows form

Der Code für die Schaltflächen ist wie folgt.

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.Sql; 
using System.Data.SqlClient; 

namespace Basque 
{ 
    public partial class Form1 : Form 
    { 
     private String strFirstName; 
     private String strLastName; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnSave_Click(object sender, EventArgs e) 
     { 
      strFirstName = txtFirstName.Text; 
      strLastName = txtLastName.Text; 
      int tempNo; 
      AddNames(strFirstName, strLastName); 
      txtFirstName.Clear(); 
      txtLastName.Clear(); 
     } 

     private void btnExit_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
      this.Dispose(); 
     } 

     public void AddNames(String strFirstName, String strLastName) 
     { 
      String connString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\BasqueNames.mdf;Integrated Security=True"; 

      SqlConnection oCON = new SqlConnection(connString); 
      oCON.Open(); 

      SqlCommand oCMD = new SqlCommand(); 
      oCMD.Connection = oCON; 
      oCMD.CommandType = CommandType.StoredProcedure; 
      oCMD.CommandText = "usp_BasqueNames_Insert"; 

      oCMD.Parameters.AddWithValue("@First", strFirstName); 
      oCMD.Parameters.AddWithValue("@Last", strLastName); 

      oCMD.ExecuteNonQuery(); 
      oCON.Close(); 
     } 
    } 
} 

Das Schema für die Datenbank ist als

CREATE TABLE [dbo].[Names] 
(
    [Id]  INT  IDENTITY (1, 1) NOT NULL, 
    [FirstName] NCHAR (10) NULL, 
    [LastName] NCHAR (10) NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

Und die gespeicherte Prozedur folgt, wird wie folgt

CREATE PROCEDURE usp_BasqueNames_Insert 
    @First NCHAR(10), 
    @Last NCHAR(10) 
AS 
    INSERT INTO Names(FirstName, LastName) 
    VALUES (@First, @Last) 

    RETURN @@identity 

Eine Sache, die mir seltsam auffällt, ist, dass, wenn ich zum Debuggen starten die App, der Datenbankname im Server-Explorer hat sofort ein rotes X drauf.

+1

Das rote x könnte ein Fehler sein, den Sie ansprechen müssen. Bewegen Sie den Mauszeiger darüber und sehen Sie, ob ein Popup-Fenster mit weiteren Details angezeigt wird. – Theo

+1

Tipp: '@@ IDENTITY' kann überraschende Ergebnisse liefern, wenn Trigger vorhanden sind. 'SCOPE_IDENTITY' ist eine bessere Wahl. (Und lernen Sie später die Klausel OUTPUT kennen.) – HABO

+0

Sind Sie sicher, dass die Methode btnSave_Click ausgeführt wird, wenn auf die Schaltfläche geklickt wird? –

Antwort

0

Können Sie das versuchen? Und stellen Sie sicher, dass Sie versuchen, einen Wert nicht mehr als 10 Zeichen zu übergeben, da Ihr nchar nur (10) ist;

private void btnSave_Click(object sender, EventArgs e) 
     { 
      AddNames(txtFirstname.Text, txtLastName.Text); 
      txtFirstName.Clear(); 
      txtLastName.Clear(); 
     } 


     public void AddNames(string strFirstName, string strLastName) 
     { 
      String connString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\BasqueNames.mdf;Integrated Security=True"; 

      using(SqlConnection oCON = new SqlConnection(connString)) 
      { 
      SqlCommand oCMD = new SqlCommand("usp_BasqueNames_Insert",oCon); 
    oCMD.CommandType = CommandType.StoredProcedure; 

      oCMD.Parameters.Add("@First", SqlDbType.Nchar).Value = strFirstName; 
      oCMD.Parameters.Add("@Last", SqlDbType.Nchar).Value = strLastName; 

      oCMD.ExecuteNonQuery(); 
      } 
     } 
0

Danke für alle Empfehlungen und Unterstützung.

Eine Sache musste sich ändern, ich musste installieren und eine Verbindung zu SQL Express herstellen. Ich habe festgestellt, dass die Visual Studio-Datenbank in Visual Studio unzuverlässig ist, um eine Verbindung herzustellen.

private void btnSave_Click(object sender, EventArgs e) 
    { 
     AddNames(txtFirstname.Text, txtLastName.Text); 
     txtFirstName.Clear(); 
     txtLastName.Clear(); 
    } 


    public void AddNames(string strFirstName, string strLastName) 
    { 
     String connString = @"Data Source=ERNIE\SQLEXPRESS;Initial Catalog=LeatherDress;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"; 


     using(SqlConnection oCON = new SqlConnection(connString)) 
     { 
     SqlCommand oCMD = new SqlCommand("usp_BasqueNames_Insert",oCon); 
     oCMD.CommandType = CommandType.StoredProcedure; 

     oCMD.Parameters.Add("@First", SqlDbType.Nchar).Value = strFirstName; 
     oCMD.Parameters.Add("@Last", SqlDbType.Nchar).Value = strLastName; 

     oCON.open(); 
     oCMD.ExecuteNonQuery(); 
     oCON.close(); 
     } 
    } 
Verwandte Themen