Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#插入而不是插入触发器_C#_Sql_Sql Server_Tsql - Fatal编程技术网

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);