C#插入而不是插入触发器
我的数据库中有一个表C#插入而不是插入触发器,c#,sql,sql-server,tsql,C#,Sql,Sql Server,Tsql,我的数据库中有一个表Teacher: TABLE Teacher ( ID CHAR (7) NOT NULL , name VARCHAR (50) NOT NULL , surname VARCHAR (50) NOT NULL , email VARCHAR (50) NOT NULL , phone CH
Teacher
:
TABLE Teacher
(
ID CHAR (7) NOT NULL ,
name VARCHAR (50) NOT NULL ,
surname VARCHAR (50) NOT NULL ,
email VARCHAR (50) NOT NULL ,
phone CHAR (13) NOT NULL
)
在数据库中,我有一个而不是INSERT
触发器,它创建ID
和来自姓氏和数字的电子邮件。当我插入SQL Server时,一切正常。我能行
INSERT INTO Teacher(name, surname, phone)
VALUES('John', 'Doe', '+111111111111')
我正在这个数据库上实现ORM
public static String SQL_INSERT =
"INSERT INTO \"Teacher\" VALUES (@ID, @name, @surname, @email, @phone)";
public static int Insert(Teacher teacher, Database pDb = null)
{
Database db;
if (pDb == null)
{
db = new Database();
db.Connect();
}
else
{
db = (Database)pDb;
}
SqlCommand command = db.CreateCommand(SQL_INSERT);
PrepareCommand(command, teacher);
int ret = db.ExecuteNonQuery(command);
if (pDb == null)
{
db.Close();
}
return ret;
}
private static void PrepareCommand(SqlCommand command, Teacher teacher)
{
command.Parameters.AddWithValue("@ID", teacher.ID);
command.Parameters.AddWithValue("@name", teacher.Name);
command.Parameters.AddWithValue("@surname", teacher.Surname);
command.Parameters.AddWithValue("@email", teacher.Email);
command.Parameters.AddWithValue("@phone", teacher.Phone);
}
问题是当我尝试从ORM插入时。我必须这样做,因为它不允许在没有所有必需属性的情况下插入
Teacher newTeacher = new Teacher ();
newTeacher.ID = "";
newTeacher.Name= "John";
newTeacher.Surname= "Doe";
newTeacher.Email = "";
newTeacher.Phone= "+111111111111";
TeacherTable.Insert(newTeacher, db);
是否有任何方法可以插入而不必在ID和电子邮件中指定空字符串,但是代码对我来说很糟糕。谢谢您的帮助。如果您使用默认约束定义表,则插入时会将值设置为默认值,而无需触发器
CREATE TABLE Teacher
(
ID CHAR (7) NOT NULL, --don't know what is the content here... In most cases an ID column with INT IDENTITY is perefered
name VARCHAR (50) NOT NULL CONSTRAINT DF_Teacher_name DEFAULT(''),
surname VARCHAR (50) NOT NULL CONSTRAINT DF_Teacher_surname DEFAULT('') ,
email VARCHAR (50) NOT NULL CONSTRAINT DF_Teacher_email DEFAULT('') ,
phone CHAR (13) NOT NULL CONSTRAINT DF_Teacher_phone DEFAULT('')
);
顺便说一句:我不会强制电话号码包含13个字符…您可以使用PrepareCommand并将其默认为空
private static void PrepareCommand(SqlCommand command, Teacher teacher)
{
command.Parameters.AddWithValue("@ID", teacher.ID ?? "");
command.Parameters.AddWithValue("@name", teacher.Name);
command.Parameters.AddWithValue("@surname", teacher.Surname);
command.Parameters.AddWithValue("@email", teacher.Email ?? "");
command.Parameters.AddWithValue("@phone", teacher.Phone);
}
或者,如果它们为null,则根本无法传递它们,然后在触发器中提供默认值
private static void PrepareCommand(SqlCommand command, Teacher teacher)
{
if(string.IsNullOrEmpty(teacher.ID))
command.Parameters.AddWithValue("@ID", teacher.ID);
command.Parameters.AddWithValue("@name", teacher.Name);
command.Parameters.AddWithValue("@surname", teacher.Surname);
if(string.IsNullOrEmpty(teacher.Email))
command.Parameters.AddWithValue("@email", teacher.Email);
command.Parameters.AddWithValue("@phone", teacher.Phone);
}
这两种方法都允许您创建教师对象,如
Teacher newTeacher = new Teacher ();
newTeacher.Name= "John";
newTeacher.Surname= "Doe";
newTeacher.Phone= "+111111111111";
TeacherTable.Insert(newTeacher, db);
ORM正在做它应该做的事情。如果您的表字段可以为NULL,并且您的变量是未设置的引用类型,那么它应该插入NULL。顺便说一下,字符串是引用类型 处理这个问题最干净的方法之一是在教师类中添加一个构造函数,为所有值设置默认值,这样,您就不必每次新建一个新对象时都设置它们 例如 然后您可以执行以下操作:
Teacher newTeacher = new Teacher ();
newTeacher.Name = "Johnny";
TeacherTable.Insert(newTeacher, db);
仅设置所需的变量,所有其他变量都将是构造函数中的默认设置。ID的内容是什么?您的SQL\u INSERT string强制您提供所有参数,您可能应该动态地为查询构建参数。您有什么理由要创建自己的自制ORM吗?这些问题中的许多已经被诸如实体框架或NHibernate之类的ORM解决了。为什么不选择现成的东西,这样你就不会浪费时间复制已经存在的东西呢?“在数据库中,我有一个INSERT触发器,它根据姓氏和数字创建
ID
和email
。”他既不存储空值,也不存储空值。@fqhv-我错过了,谢谢。同意电话号码评论,我们不能忘记国际号码@DavidC和我同意你的答案,我的投票结果是:-)你应该检查并停止使用.AddWithValue()
-这可能会导致意外和令人惊讶的结果。。。
Teacher newTeacher = new Teacher ();
newTeacher.Name = "Johnny";
TeacherTable.Insert(newTeacher, db);