创建后数据未保存在数据库中(CRUD)
Data not Saving in Database after Creating (CRUD)
我正在开发简单的 CRUD 应用程序,其中有两个表:
患者
- CNIC(varchar 50 和 PK)
- 名称 (varchar 50)
患者疫苗
- Cnic(varchar 50 和 FK)
- 疫苗接种名称(varchar)
- 疫苗接种日期(varchar)
- 中心地址 (varchar)
我知道将字符串作为 PK,FK 不是一个好方法,但这是我的要求。
我有一个 PatientDBContext
class,我在其中执行 CRUD 操作:
public class PatentDBContext
{
string cs = ConfigurationManager.ConnectionStrings["Myconnection"].ConnectionString;
public List<Patient> getPatients()
{
List<Patient> PatientList = new List<Patient>();
SqlConnection con = new SqlConnection(cs);
string query = "SELECT p.CNIC, p.Name, pv.cnic, pv.VaccinationName, pv.VaccinationDate, pv.CenterAddress FROM Patient AS p JOIN PatientVaccines AS pv ON p.CNIC = pv.cnic";
SqlCommand cmd = new SqlCommand(query, con);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Patient p = new Patient();
p.CNIC = dr["CNIC"].ToString();
p.Name = dr["Name"].ToString();
p.VaccinationName = dr["VaccinationName"].ToString();
//p.VaccinationDate = dr["VaccinationDate"].ToString();
p.CentreAddress = dr["CenterAddress"].ToString();
PatientList.Add(p);
}
con.Close();
return PatientList;
}
public bool AddPatient(Patient pat)
{
SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand("spAddPatient", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CNIC", pat.CNIC);
cmd.Parameters.AddWithValue("@Name", pat.Name);
cmd.Parameters.AddWithValue("@VaccinationName", pat.VaccinationName);
cmd.Parameters.AddWithValue("@VaccinationDate", pat.VaccinationDate);
cmd.Parameters.AddWithValue("@CenterAddress", pat.CentreAddress);
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i > 0)
{
return true;
}
else
{
return false;
}
}
public bool UpdatePatient(Patient pat)
{
SqlConnection con = new SqlConnection();
string query = "UPDATE PatientVaccines SET VaccinationName = @VaccinationName, VaccinationDate = @VacinationDate, CenterAddress = @CenterAddress WHERE Cnic = @Cnic";
SqlCommand cmd = new SqlCommand(query, con);
//cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CNIC", pat.CNIC);
//cmd.Parameters.AddWithValue("@Name", pat.Name);
cmd.Parameters.AddWithValue("@VaccinationName", pat.VaccinationName);
cmd.Parameters.AddWithValue("@VaccinationDate", pat.VaccinationDate);
cmd.Parameters.AddWithValue("@CenterAddress", pat.CentreAddress);
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i > 0)
{
return true;
}
else
{
return false;
}
}
}
错误是这个 class 在 getPatient()
函数中 我把它注释掉 p.VaccinationDate
显示一个错误,我无法将类型字符串隐式转换为 DateTime,如何将其转换为日期时间?
我有另一个函数名称 AddPatient()
现在显示任何错误或错误,但是当我在输入记录后单击提交按钮时它不执行任何操作。
家庭控制器
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
PatentDBContext db = new PatentDBContext();
List<Patient> obj = db.getPatients();
return View(obj);
}
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Patient pat)
{
try
{
if (ModelState.IsValid == true)
{
PatentDBContext context = new PatentDBContext();
bool check = context.AddPatient(pat);
if (check == true)
{
TempData["InsertMessage"] = "Data Inserted..";
}
else
{
TempData["FailureMessage"] = "Data Not Inserted";
}
ModelState.Clear();
return RedirectToAction("Index");
}
return View();
}
catch
{
return View();
}
}
public ActionResult Edit(string Cnin)
{
PatentDBContext context = new PatentDBContext();
//string str = Cnin.ToString();
var row = context.getPatients().Find(model => model.CNIC = Cnin);
return View(row);
}
}
这里我也无法将字符串隐式转换为bool
var row = context.getPatients().Find(model => model.CNIC = Cnin);
最后这是我的存储过程:
ALTER PROCEDURE [dbo].[spAddPatient]
(@CNIC varchar(50),
@Name varchar(50),
@VaccinationName varchar(50),
@VaccinationDate varchar(50),
@CenterAddress varchar(50))
AS
BEGIN
INSERT INTO Patient (CNIC, Name)
VALUES (@CNIC, @Name)
INSERT INTO PatientVaccines (Cnic, VaccinationName, VaccinationDate, CenterAddress)
VALUES (@Cnic, @VaccinationName, @VaccinationDate, @CenterAddress)
END
我认为你的存储过程不正确,你可以事先在数据库中测试它。
// here you should use operator== instead of аssignment operator=
// Have in mind that .Find will throw an error if model with given Cnin is not found
var row = context.getPatients().Find(model => model.CNIC == Cnin);
How to convert a string to datetime object
一般建议,您可以google您遇到的错误并查找相关信息
我很确定你在这项技术中 very new
因为有一些 basic mistake
。我在下面提到一些 common mistake
:
- 你 不应该使用
varchar
作为 primary key
而是使用 int
- 使用
int
列在父子 table 中建立关系。
- 不要为
date field
使用 varchar
,而是使用 DateTime
。
我redesigned
两个table如下:
患者Table
CREATE TABLE [dbo].[Patient](
[Id] [int] IDENTITY(1,1) NOT NULL,
[CNIC] [varchar](50) NOT NULL,
[Name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Patient] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
I introduce new column Id
that set as IDENTITY so that this
column will get value automatically like 1, 2, 3
患者疫苗Table
CREATE TABLE [dbo].[PatientVaccines](
[Id] [int] IDENTITY(1,1) NOT NULL,
[VaccinationName] [varchar](50) NULL,
[VaccinationDate] [datetime] NULL,
[CenterAddress] [varchar](50) NULL,
[PatientId] [int] NOT NULL,
CONSTRAINT [PK_PatientVaccines] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
I introduce two new columns Id
and PatientId
. when you insert a patient, the Id field will get a number automaticaly and that id will be inserted into PatientVaccines Table
as PatientId
so that you can find the relational data. Also I used datetime
for VaccinationDate
.
外键约束
ALTER TABLE [dbo].[PatientVaccines] WITH CHECK ADD CONSTRAINT [FK_PatientVaccines_Patient] FOREIGN KEY([PatientId])
REFERENCES [dbo].[Patient] ([Id])
This is a constraint or rules
that will restrict you to insert data that is not relational. for example: you do not have a record of patient with Id 101
but you are trying to insert PatientVaccines
record with PatientId 101
then this rule will restrict you to do that.
这是Sql两个tables
的图表
通过执行上述操作,您需要如下更新 Stored Procedure
:
CREATE PROCEDURE [dbo].[spAddPatient]
(@CNIC varchar(50),
@Name varchar(50),
@VaccinationName varchar(50),
@VaccinationDate datetime,
@CenterAddress varchar(50))
AS
BEGIN
INSERT INTO Patient (CNIC, Name)
VALUES (@CNIC, @Name)
INSERT INTO PatientVaccines (PatientId, VaccinationName, VaccinationDate, CenterAddress)
VALUES (@@Identity, @VaccinationName, @VaccinationDate, @CenterAddress)
END
这是完整的C#
代码,我做了一些更正
public class PatentDBContext
{
string cs = ConfigurationManager.ConnectionStrings["Myconnection"].ConnectionString;
public List<Patient> getPatients()
{
List<Patient> PatientList = new List<Patient>();
SqlConnection con = new SqlConnection(cs);
string query = "SELECT p.CNIC, p.Name, pv.VaccinationName, pv.VaccinationDate, pv.CenterAddress FROM Patient AS p JOIN PatientVaccines AS pv ON p.Id = pv.PatientId";
SqlCommand cmd = new SqlCommand(query, con);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Patient p = new Patient();
p.CNIC = dr["CNIC"].ToString();
p.Name = dr["Name"].ToString();
p.VaccinationName = dr["VaccinationName"].ToString();
p.VaccinationDate = Convert.ToDateTime(dr["VaccinationDate"]);
p.CenterAddress = dr["CenterAddress"].ToString();
PatientList.Add(p);
}
con.Close();
return PatientList;
}
public bool AddPatient(Patient pat)
{
SqlConnection con = new SqlConnection(cs);
SqlCommand cmd = new SqlCommand("spAddPatient", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CNIC", pat.CNIC);
cmd.Parameters.AddWithValue("@Name", pat.Name);
cmd.Parameters.AddWithValue("@VaccinationName", pat.VaccinationName);
cmd.Parameters.AddWithValue("@VaccinationDate", pat.VaccinationDate);
cmd.Parameters.AddWithValue("@CenterAddress", pat.CenterAddress);
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i > 0)
{
return true;
}
else
{
return false;
}
}
public bool UpdatePatient(Patient pat)
{
SqlConnection con = new SqlConnection(cs);
string query = "UPDATE PatientVaccines SET VaccinationName = @VaccinationName, VaccinationDate = @VaccinationDate, CenterAddress = @CenterAddress WHERE PatientId = ( Select Id from Patient where Cnic = @Cnic)";
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.AddWithValue("@CNIC", pat.CNIC);
//cmd.Parameters.AddWithValue("@Name", pat.Name);
cmd.Parameters.AddWithValue("@VaccinationName", pat.VaccinationName);
cmd.Parameters.AddWithValue("@VaccinationDate", pat.VaccinationDate);
cmd.Parameters.AddWithValue("@CenterAddress", pat.CenterAddress);
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i > 0)
{
return true;
}
else
{
return false;
}
}
}
我正在开发简单的 CRUD 应用程序,其中有两个表:
患者
- CNIC(varchar 50 和 PK)
- 名称 (varchar 50)
患者疫苗
- Cnic(varchar 50 和 FK)
- 疫苗接种名称(varchar)
- 疫苗接种日期(varchar)
- 中心地址 (varchar)
我知道将字符串作为 PK,FK 不是一个好方法,但这是我的要求。
我有一个 PatientDBContext
class,我在其中执行 CRUD 操作:
public class PatentDBContext
{
string cs = ConfigurationManager.ConnectionStrings["Myconnection"].ConnectionString;
public List<Patient> getPatients()
{
List<Patient> PatientList = new List<Patient>();
SqlConnection con = new SqlConnection(cs);
string query = "SELECT p.CNIC, p.Name, pv.cnic, pv.VaccinationName, pv.VaccinationDate, pv.CenterAddress FROM Patient AS p JOIN PatientVaccines AS pv ON p.CNIC = pv.cnic";
SqlCommand cmd = new SqlCommand(query, con);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Patient p = new Patient();
p.CNIC = dr["CNIC"].ToString();
p.Name = dr["Name"].ToString();
p.VaccinationName = dr["VaccinationName"].ToString();
//p.VaccinationDate = dr["VaccinationDate"].ToString();
p.CentreAddress = dr["CenterAddress"].ToString();
PatientList.Add(p);
}
con.Close();
return PatientList;
}
public bool AddPatient(Patient pat)
{
SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand("spAddPatient", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CNIC", pat.CNIC);
cmd.Parameters.AddWithValue("@Name", pat.Name);
cmd.Parameters.AddWithValue("@VaccinationName", pat.VaccinationName);
cmd.Parameters.AddWithValue("@VaccinationDate", pat.VaccinationDate);
cmd.Parameters.AddWithValue("@CenterAddress", pat.CentreAddress);
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i > 0)
{
return true;
}
else
{
return false;
}
}
public bool UpdatePatient(Patient pat)
{
SqlConnection con = new SqlConnection();
string query = "UPDATE PatientVaccines SET VaccinationName = @VaccinationName, VaccinationDate = @VacinationDate, CenterAddress = @CenterAddress WHERE Cnic = @Cnic";
SqlCommand cmd = new SqlCommand(query, con);
//cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CNIC", pat.CNIC);
//cmd.Parameters.AddWithValue("@Name", pat.Name);
cmd.Parameters.AddWithValue("@VaccinationName", pat.VaccinationName);
cmd.Parameters.AddWithValue("@VaccinationDate", pat.VaccinationDate);
cmd.Parameters.AddWithValue("@CenterAddress", pat.CentreAddress);
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i > 0)
{
return true;
}
else
{
return false;
}
}
}
错误是这个 class 在 getPatient()
函数中 我把它注释掉 p.VaccinationDate
显示一个错误,我无法将类型字符串隐式转换为 DateTime,如何将其转换为日期时间?
我有另一个函数名称 AddPatient()
现在显示任何错误或错误,但是当我在输入记录后单击提交按钮时它不执行任何操作。
家庭控制器
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
PatentDBContext db = new PatentDBContext();
List<Patient> obj = db.getPatients();
return View(obj);
}
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Patient pat)
{
try
{
if (ModelState.IsValid == true)
{
PatentDBContext context = new PatentDBContext();
bool check = context.AddPatient(pat);
if (check == true)
{
TempData["InsertMessage"] = "Data Inserted..";
}
else
{
TempData["FailureMessage"] = "Data Not Inserted";
}
ModelState.Clear();
return RedirectToAction("Index");
}
return View();
}
catch
{
return View();
}
}
public ActionResult Edit(string Cnin)
{
PatentDBContext context = new PatentDBContext();
//string str = Cnin.ToString();
var row = context.getPatients().Find(model => model.CNIC = Cnin);
return View(row);
}
}
这里我也无法将字符串隐式转换为bool
var row = context.getPatients().Find(model => model.CNIC = Cnin);
最后这是我的存储过程:
ALTER PROCEDURE [dbo].[spAddPatient]
(@CNIC varchar(50),
@Name varchar(50),
@VaccinationName varchar(50),
@VaccinationDate varchar(50),
@CenterAddress varchar(50))
AS
BEGIN
INSERT INTO Patient (CNIC, Name)
VALUES (@CNIC, @Name)
INSERT INTO PatientVaccines (Cnic, VaccinationName, VaccinationDate, CenterAddress)
VALUES (@Cnic, @VaccinationName, @VaccinationDate, @CenterAddress)
END
我认为你的存储过程不正确,你可以事先在数据库中测试它。
// here you should use operator== instead of аssignment operator=
// Have in mind that .Find will throw an error if model with given Cnin is not found
var row = context.getPatients().Find(model => model.CNIC == Cnin);
How to convert a string to datetime object
一般建议,您可以google您遇到的错误并查找相关信息
我很确定你在这项技术中 very new
因为有一些 basic mistake
。我在下面提到一些 common mistake
:
- 你 不应该使用
varchar
作为primary key
而是使用int
- 使用
int
列在父子 table 中建立关系。 - 不要为
date field
使用varchar
,而是使用DateTime
。
我redesigned
两个table如下:
患者Table
CREATE TABLE [dbo].[Patient](
[Id] [int] IDENTITY(1,1) NOT NULL,
[CNIC] [varchar](50) NOT NULL,
[Name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Patient] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
I introduce new column
Id
that set as IDENTITY so that this column will get value automatically like 1, 2, 3
患者疫苗Table
CREATE TABLE [dbo].[PatientVaccines](
[Id] [int] IDENTITY(1,1) NOT NULL,
[VaccinationName] [varchar](50) NULL,
[VaccinationDate] [datetime] NULL,
[CenterAddress] [varchar](50) NULL,
[PatientId] [int] NOT NULL,
CONSTRAINT [PK_PatientVaccines] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
I introduce two new columns
Id
andPatientId
. when you insert a patient, the Id field will get a number automaticaly and that id will be inserted intoPatientVaccines Table
asPatientId
so that you can find the relational data. Also I useddatetime
forVaccinationDate
.
外键约束
ALTER TABLE [dbo].[PatientVaccines] WITH CHECK ADD CONSTRAINT [FK_PatientVaccines_Patient] FOREIGN KEY([PatientId])
REFERENCES [dbo].[Patient] ([Id])
This is a
constraint or rules
that will restrict you to insert data that is not relational. for example: you do not have a record of patient with Id101
but you are trying to insertPatientVaccines
record withPatientId 101
then this rule will restrict you to do that.
这是Sql两个tables
的图表通过执行上述操作,您需要如下更新 Stored Procedure
:
CREATE PROCEDURE [dbo].[spAddPatient]
(@CNIC varchar(50),
@Name varchar(50),
@VaccinationName varchar(50),
@VaccinationDate datetime,
@CenterAddress varchar(50))
AS
BEGIN
INSERT INTO Patient (CNIC, Name)
VALUES (@CNIC, @Name)
INSERT INTO PatientVaccines (PatientId, VaccinationName, VaccinationDate, CenterAddress)
VALUES (@@Identity, @VaccinationName, @VaccinationDate, @CenterAddress)
END
这是完整的C#
代码,我做了一些更正
public class PatentDBContext
{
string cs = ConfigurationManager.ConnectionStrings["Myconnection"].ConnectionString;
public List<Patient> getPatients()
{
List<Patient> PatientList = new List<Patient>();
SqlConnection con = new SqlConnection(cs);
string query = "SELECT p.CNIC, p.Name, pv.VaccinationName, pv.VaccinationDate, pv.CenterAddress FROM Patient AS p JOIN PatientVaccines AS pv ON p.Id = pv.PatientId";
SqlCommand cmd = new SqlCommand(query, con);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Patient p = new Patient();
p.CNIC = dr["CNIC"].ToString();
p.Name = dr["Name"].ToString();
p.VaccinationName = dr["VaccinationName"].ToString();
p.VaccinationDate = Convert.ToDateTime(dr["VaccinationDate"]);
p.CenterAddress = dr["CenterAddress"].ToString();
PatientList.Add(p);
}
con.Close();
return PatientList;
}
public bool AddPatient(Patient pat)
{
SqlConnection con = new SqlConnection(cs);
SqlCommand cmd = new SqlCommand("spAddPatient", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CNIC", pat.CNIC);
cmd.Parameters.AddWithValue("@Name", pat.Name);
cmd.Parameters.AddWithValue("@VaccinationName", pat.VaccinationName);
cmd.Parameters.AddWithValue("@VaccinationDate", pat.VaccinationDate);
cmd.Parameters.AddWithValue("@CenterAddress", pat.CenterAddress);
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i > 0)
{
return true;
}
else
{
return false;
}
}
public bool UpdatePatient(Patient pat)
{
SqlConnection con = new SqlConnection(cs);
string query = "UPDATE PatientVaccines SET VaccinationName = @VaccinationName, VaccinationDate = @VaccinationDate, CenterAddress = @CenterAddress WHERE PatientId = ( Select Id from Patient where Cnic = @Cnic)";
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.AddWithValue("@CNIC", pat.CNIC);
//cmd.Parameters.AddWithValue("@Name", pat.Name);
cmd.Parameters.AddWithValue("@VaccinationName", pat.VaccinationName);
cmd.Parameters.AddWithValue("@VaccinationDate", pat.VaccinationDate);
cmd.Parameters.AddWithValue("@CenterAddress", pat.CenterAddress);
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i > 0)
{
return true;
}
else
{
return false;
}
}
}