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
);
Entweder Preis oder CategoryId ist nicht numerisch –
können Sie Sie DB-Tabellenstruktur teilen? –
Ich habe meinen Beitrag bearbeitet –