2017-01-15 3 views
0

Entity-Klasse umzuwandeln, die das Objekt I DB hinzufügen mag:ASP.NET Sql einfügen Fehlerdatentyp nvarchar in numerischer

public class Item 
{ 
    [Key] 
    public long Id { get; set; } 

    [MaxLength(100)] 
    [Required] 
    public string Name { get; set; } 

    [MaxLength(1000)] 
    public string Description { get; set; } 

    [Required] 
    public decimal Price { get; set; } 

    public Currency Currency { get; set; } 

    public bool Negotiable { get; set; } 

    public virtual List<Photo> Photos { get; set; } 
    public Category Category { get; set; } 

    [Required] 
    public byte CategoryId { get; set; } 

    [Required] 
    public string OwnerId { get; set; } 

    public ApplicationUser Owner { get; set; } 
} 

Es ist lokaler Db, mit Code-First-Ansatz erzeugt. Und nun möchte ich eine Zeile in meiner Anwendung hinzufügen mit SQL-Befehl:

public void AddItem(Item item) 
    { 

     var cnnString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 

     var cmd = "INSERT INTO Items([Id],[Name],[Description] ,[Price] , [Currency] , [Negotiable], [CategoryId], [OwnerId]) VALUES(@id,@name,@description,@price,@currency,@negotiable,@categoryId,@ownerId)"; 

     using (SqlConnection cnn = new SqlConnection(cnnString)) 
     { 

      using (SqlCommand cmd1 = new SqlCommand(cmd, cnn)) 
      { 
       cnn.Open(); 
       cmd1.CommandText = "SELECT MAX(Id) FROM Items"; 
       using (SqlDataReader reader = cmd1.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         int maxId = Convert.ToInt32(cmd1.ExecuteScalar()); 
         item.Id = maxId; 
        } 
       } 

       cmd1.Parameters.AddWithValue("@id", item.Id); 
       cmd1.Parameters.AddWithValue("@name", item.Name); 
       cmd1.Parameters.AddWithValue("@description", item.Description); 
       cmd1.Parameters.Add("@price", SqlDbType.Decimal).Value = item.Price; 
       cmd1.Parameters.AddWithValue("@currency", item.Currency); 
       cmd1.Parameters.AddWithValue("@negotiable", item.Negotiable); 
       cmd1.Parameters.AddWithValue("@categoryId", item.CategoryId); 
       cmd1.Parameters.AddWithValue("@ownerId", item.OwnerId); 



       cmd1.ExecuteNonQuery(); //* 
      } 
     } 

    } 

EDITED: Dieser Code oben wirft Ausnahme: hier ist bereits eine offene Datareader mit diesem Befehl zugeordnet, der zuerst geschlossen werden muss „“.

DB Schema in T-SQL wie unten definiert ist:

CREATE TABLE [dbo].[Items] (
[Id]   BIGINT   IDENTITY (1, 1) NOT NULL, 
[Name]  NVARCHAR (100) NOT NULL, 
[Description] NVARCHAR (1000) NULL, 
[Price]  DECIMAL (18, 2) NOT NULL, 
[Currency] INT    NOT NULL, 
[Negotiable] BIT    NOT NULL, 
[CategoryId] TINYINT   NOT NULL, 
[Category_Id] INT    NULL, 
[OwnerId]  NVARCHAR (128) DEFAULT ('') NOT NULL, 
CONSTRAINT [PK_dbo.Items] PRIMARY KEY CLUSTERED ([Id] ASC), 
CONSTRAINT [FK_dbo.Items_dbo.Categories_Category_Id] FOREIGN KEY ([Category_Id]) REFERENCES [dbo].[Categories] ([Id]), 
CONSTRAINT [FK_dbo.Items_dbo.AspNetUsers_OwnerId] FOREIGN KEY ([OwnerId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE 

);

+1

Entweder Preis oder CategoryId ist nicht numerisch –

+0

können Sie Sie DB-Tabellenstruktur teilen? –

+0

Ich habe meinen Beitrag bearbeitet –

Antwort

1

ändern Sie die Abfrage zu diesem einfügen. und versuchen jetzt

  public long AddItem(Item item) 
     { 

     var cnnString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 
     var cmdInsert = "INSERT INTO Items([Name],[Description] ,[Price] , [Currency] , [Negotiable], [CategoryId], [OwnerId]) VALUES(@name,@description,@price,@currency,@negotiable,@categoryId,@ownerId)"; 


     using (SqlConnection cnn = new SqlConnection(cnnString)) 
     { 
     cnn.Open(); 
     using (SqlCommand cmd1 = new SqlCommand(cmdInsert, cnn)) 
     { 

     cmd1.Parameters.AddWithValue("@name", item.Name); 
     cmd1.Parameters.AddWithValue("@description", item.Description); 
     cmd1.Parameters.Add("@price", SqlDbType.Decimal).Value = item.Price; 
     cmd1.Parameters.AddWithValue("@currency", item.Currency); 
     cmd1.Parameters.AddWithValue("@negotiable", item.Negotiable); 
     cmd1.Parameters.AddWithValue("@categoryId", item.CategoryId); 
     cmd1.Parameters.AddWithValue("@ownerId", item.OwnerId); 

     cmd1.ExecuteNonQuery(); 
     } 
     cnn.Close(); 
     } 

     } 
+0

Wenn Sie mir Profilerausgabe zeigen können, kann ich das Problem finden. –

+0

Wie geht das, kann ich in Visual Studio? –

+0

ok Sie haben den lokalen SQL-Server auf Ihrem System installiert. Wenn ja, dann öffne sql server management studio -> Tools -> SQL Server Profiler. Öffnen Sie es, Sie werden aufgefordert, eine Verbindung zum Server herzustellen, wählen Sie Ihren lokalen Server und führen Sie ihn aus. Danach führen Sie den Code aus. Sie sehen alle Abfragen, die aus Ihrer Anwendung stammen, im Protokoll. Sie müssen nur Ihre einfügen Abfrage –

0

Lassen Sie uns an Ihren Code aussehen:

var cmd = "INSERT INTO Items VALUES(@id, 
@name, 
@description, 
@price, 
@currency,  
@negotiable,  
@categoryId,  
@ownerId)"; 

und Tabellendefinition:

CREATE TABLE [dbo].[Items] (
[Id]   BIGINT   IDENTITY (1, 1) NOT NULL, 
[Name]  NVARCHAR (100) NOT NULL, 
[Description] NVARCHAR (1000) NULL, 
[Price]  DECIMAL (18, 2) NOT NULL, 
[Currency] INT    NOT NULL, 
[Negotiable] BIT    NOT NULL, 
[CategoryId] TINYINT   NOT NULL, 
[Category_Id] INT    NULL, 
[OwnerId]  NVARCHAR (128) DEFAULT ('') NOT NULL, 
CONSTRAINT [PK_dbo.Items] PRIMARY KEY CLUSTERED ([Id] ASC), 
CONSTRAINT [FK_dbo.Items_dbo.Categories_Category_Id] FOREIGN KEY ([Category_Id]) REFERENCES [dbo].[Categories] ([Id]), 
CONSTRAINT [FK_dbo.Items_dbo.AspNetUsers_OwnerId] FOREIGN KEY ([OwnerId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE) 

Sie haben CategoryId, category_id, ownerID in Tabellendefinition und nur @categoryId, @ ownerId in C#. Sie haben @category_Id Wert vergessen, ich denke

+0

Category_Id kann null sein, also ist das egal –

+0

@mike_pl Wenn Sie Spalten auslassen, sollten Sie angeben, auf welche Spalten Sie abzielen. – canon

Verwandte Themen