我正在尝试连接到本地 SQL Server Express 数据库,但是当我使用
.cshtml.cs
页面提交表单时,命令执行后数据不会出现在表中。我不确定这是连接问题还是查询问题,因为我没有收到任何错误消息。
我在网上读到有时更改可能会进入调试文件夹的数据库,但我无法让他们的解决方案为我工作。
这是我用于数据库命令的类:
using Microsoft.Data.SqlClient;
public class DbController
{
public DbController()
{
}
public void AggiungiUtente(string email, string pass, string ruolo)
{
using (SqlConnection conn = new SqlConnection("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=DomainDb;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False"))
{
try
{
conn.Open();
string query = "INSERT INTO Utente (Email, PasswordHash, DataCreazione, Ruolo) VALUES (Email, PasswordHash, DataCreazione, Ruolo)";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine("Errore nella connessione :( " + ex.Message);
}
}
}
}
这是 Razor 页面表单:
@page "/aggiungiutenti"
@{Layout = null;}
<!doctype html>
<html class="fixed">
<head>
<!-- Basic -->
<meta charset="UTF-8">
<title>Form Layouts | Porto Admin - Responsive HTML5 Template</title>
<meta name="keywords" content="HTML5 Admin Template" />
<meta name="description" content="Porto Admin - Responsive HTML5 Template">
<meta name="author" content="okler.net">
<!-- Mobile Metas -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<!-- Web Fonts -->
<link href="https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700,800|Shadows+Into+Light" rel="stylesheet" type="text/css">
<!-- Vendor CSS -->
<link rel="stylesheet" href="vendor/bootstrap/css/bootstrap.css" />
<link rel="stylesheet" href="vendor/animate/animate.compat.css">
<link rel="stylesheet" href="vendor/font-awesome/css/all.min.css" />
<link rel="stylesheet" href="vendor/boxicons/css/boxicons.min.css" />
<link rel="stylesheet" href="vendor/magnific-popup/magnific-popup.css" />
<link rel="stylesheet" href="vendor/bootstrap-datepicker/css/bootstrap-datepicker3.css" />
<!-- Theme CSS -->
<link rel="stylesheet" href="css/theme.css" />
<!-- Skin CSS -->
<link rel="stylesheet" href="css/skins/default.css" />
<!-- Theme Custom CSS -->
<link rel="stylesheet" href="css/custom.css">
<!-- Head Libs -->
<script src="vendor/modernizr/modernizr.js"></script>
</head>
<body>
<section class="body-sign">
<div class="card-sign center-sign">
<div class="card-body mt-3">
<form method="post">
<div class="form-group mb3">
<label>Email:</label>
<div>
<input type="email" name="email" class="form-control form-control-lg">
</div>
</div>
<div class="form-group mb3">
<label>Password:</label>
<div>
<input type="password" name="password" class="form-control form-control-lg">
</div>
</div>
<div class="form-group row pb-4">
<label class="form-group mb3">Ruolo:</label>
<div>
<select class="form-control form-control-lg mb-3" name="ruolo">
<option style="text-align: center" selected>Amministratore</option>
<option style="text-align: center">Utente</option>
</select>
</div>
</div>
<button type="submit" class="btn btn-primary" style="display: block; margin: 0 auto; width: 100%;">Invia </button>
</form>
</div>
</div>
</section>
</body>
</html>
以及处理表单的 cshtml.cs 文件:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace DomainManager.Pages
{
public class AggiungiUtentiModel : PageModel
{
private readonly DbController _DbController;
public AggiungiUtentiModel()
{
_DbController = new DbController();
}
public IActionResult OnPost(string email, string password, string ruolo)
{
if(ModelState.IsValid)
{
_DbController.AggiungiUtente(email, password, ruolo);
return Page();
}
else return Page();
}
}
}
我已经检查了我的连接字符串和代码,应该将数据插入表中,但是当我检查数据库时,它仍然显示为空。
问题是,即使没有抛出错误,数据库也不会反映更改。整个事情对我来说看起来很简单,但我不知道还能去哪里看看。如有任何帮助,我们将不胜感激!
我们先确保连接字符串正确,然后就可以查询出当前的数据表,然后尝试插入数据。我用下面的代码进行了测试,它对我有用。
public IActionResult OnPost(string email, string password, string ruolo)
{
if (ModelState.IsValid)
{
var connection = "Server=(localdb)\\mssqllocaldb;Database=aspnet-WebAppxxxxx5BEC;Trusted_Connection=True;MultipleActiveResultSets=true";
using (SqlConnection conn = new SqlConnection(connection))
{
try
{
conn.Open();
string query = "INSERT INTO Utente (Email, PasswordHash, Ruolo) VALUES (@Email, @PasswordHash, @Ruolo)";
string search = "select * from Utente";
SqlCommand selCmd = new SqlCommand(search, conn);
SqlDataAdapter da = new SqlDataAdapter(selCmd);
var dataTable = new DataTable();
da.Fill(dataTable);
var res = dataTable.AsEnumerable();
da.Dispose();
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@Email", email);
cmd.Parameters.AddWithValue("@PasswordHash", password);
cmd.Parameters.AddWithValue("@Ruolo", ruolo);
cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine("Errore nella connessione :( " + ex.Message);
}
}
return Page();
}
else return Page();
}
我的桌子如下所示。然后,如果我使用
string query = "INSERT INTO Utente (Email, PasswordHash, DataCreazione, Ruolo) VALUES (Email, PasswordHash, DataCreazione, Ruolo)";
但没有为 DataCreazione
赋予值,我会收到错误。我还需要 VALUES (@Email, @PasswordHash, @Ruolo)
而不是 VALUES (Email, PasswordHash, Ruolo)
,否则我会收到无效列错误。
CREATE TABLE [dbo].[Utente] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Email] NVARCHAR (50) NULL,
[PasswordHash] NVARCHAR (50) NULL,
[DataCreazione] NVARCHAR (50) NULL,
[Ruolo] NVARCHAR (50) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);