【问题标题】:I'm having no error but i can't insert values in database,我没有错误,但我无法在数据库中插入值,
【发布时间】:2021-09-28 17:39:19
【问题描述】:

我正在尝试从我创建的值中获取值,并且代码在任何地方都没有显示错误,但是插入不起作用,值没有进入数据库。因为我才刚刚开始学习这个,所以我并不能真正理解很多技术术语。

我的连接字符串代码

<add name="student_info" connectionString="Data Source=DESKTOP-GH4DT15\MSSQLSERVER01;Initial Catalog=RDO Student info; Integrated Security=True;"/>

这是我的插入代码

public bool insert (SchoolClass c)
{
    bool isSuccess = false;
    
    SqlConnection conn = new SqlConnection(mydbconnection);
    DataTable dt = new DataTable();
    try
    {
        string sql = "INSERT INTO student_info (schoolCode, shoolName, schoolOperater, district, taluka, uc, village, nearFamousPlace, studentName, GR, fatherName, CNIC, religion, gender, DOB_date, DOB_month, DOB_year, Address, DOA_date, DOA_month, DOA_year, classAdmitted, currentClass, section, sift, lastSchool, reasonToLeave, parentContact, emergency, DOS_date, DOS_month, DOS_year ) VALUES (@schoolCode, @shoolName, @schoolOperater, @district, @taluka, @uc, @village, @nearFamousPlace, @studentName, @GR, @fatherName, @CNIC, @religion, @gender, @DOB_date, @DOB_month, @DOB_year, @Address, @DOA_date, @DOA_month, @DOA_year, @classAdmitted, @currentClass, @section, @sift, @lastSchool, @reasonToLeave, @parentContact, @emergency, @DOS_date, @DOS_month, @DOS_year)";
        SqlCommand cmd = new SqlCommand(sql, conn);
        conn.Open();
        cmd.Parameters.AddWithValue("@schoolCode", c.schoolCode);
        cmd.Parameters.AddWithValue("@schoolName", c.schoolName);
        cmd.Parameters.AddWithValue("@schoolOperator", c.schoolOperator);
        cmd.Parameters.AddWithValue("@district", c.district);
        cmd.Parameters.AddWithValue("@taluka", c.taluka);
        cmd.Parameters.AddWithValue("@uc", c.uc);
        cmd.Parameters.AddWithValue("@village", c.village);
        cmd.Parameters.AddWithValue("@nearFamousPlace", c.nearFamousPlace);
        cmd.Parameters.AddWithValue("@studentName", c.studentName);
        cmd.Parameters.AddWithValue("@GR", c.GR);
        cmd.Parameters.AddWithValue("@fatherName", c.fatherName);
        cmd.Parameters.AddWithValue("@CNIC", c.CNIC);
        cmd.Parameters.AddWithValue("@religion", c.religion);
        cmd.Parameters.AddWithValue("@gender", c.gender);
        cmd.Parameters.AddWithValue("@DOB_date", c.dob_day);
        cmd.Parameters.AddWithValue("@DOB_month", c.dob_month);
        cmd.Parameters.AddWithValue("@DOB_year", c.dob_year);
        cmd.Parameters.AddWithValue("@Address", c.adress);
        cmd.Parameters.AddWithValue("@DOA_date", c.doa_day);
        cmd.Parameters.AddWithValue("@DOA_month", c.doa_month);
        cmd.Parameters.AddWithValue("@DOA_year", c.doa_year);
        cmd.Parameters.AddWithValue("@classAdmitted", c.classAdmitted);
        cmd.Parameters.AddWithValue("@currentClass", c.currentCalss);
        cmd.Parameters.AddWithValue("@section", c.Section);
        cmd.Parameters.AddWithValue("@shift", c.Sift);
        cmd.Parameters.AddWithValue("@lastSchool", c.lastSchool);
        cmd.Parameters.AddWithValue("@reasonToLeave", c.reasonToLeave);
        cmd.Parameters.AddWithValue("@parentContact", c.parentContact);
        cmd.Parameters.AddWithValue("@emergency", c.emergencyContact);
        cmd.Parameters.AddWithValue("@DOA_date", c.dos_day);
        cmd.Parameters.AddWithValue("@DOA_month", c.dos_month);
        cmd.Parameters.AddWithValue("@DOA_year", c.dos_year);
        
        int row = cmd.ExecuteNonQuery();
        //if successful query then vaule is greater then zero
        if (row > 0)
        {
            isSuccess = true;
        }
        else
        {
            isSuccess = false;
        }
    }
    catch (Exception ex)
    {

    }
    finally
    {
        conn.Close();
    }
    return isSuccess;
}

【问题讨论】:

  • 在您的 catch 语句中插入 MessageBox.Show(ex.ToString()); 以便您可以看到您的异常
  • 你试过调试你的代码吗?
  • 谢谢,现在我至少可以知道发生了什么
  • 我在插入语句中注意到您有shoolName,这看起来像是一个错字。您可能还想了解数据库规范化。

标签: c# sql database


【解决方案1】:

您的错误在于您的连接字符串以及您在代码中调用它的方式:

<add name="student_info" connectionString="Data Source=DESKTOP-GH4DT15\MSSQLSERVER01;Initial Catalog=RDO Student info; Integrated Security=True;"/>
  1. 您的联系人姓名是 student_info
  2. 您的数据库名称(初始目录)不应包含空格
  3. 您的数据源可以只是一个句点“。”前提是您使用的是本地连接而不是远程连接(虽然这是可选的,但可以节省一些按键操作)

您的调用代码如下所示:

using var cn = new SqlConnection(ConnectionString);
using var cmd = new SqlCommand(
            "INSERT INTO ***student_info*** (SchoolName,ParentContact) VALUES (@SchoolName,@ParentContact);SELECT CAST(scope_identity() AS int);", cn);

注意:

  1. 您的 sql 连接插入到错误的数据库表中(您可能会在此处收到错误)

  2. 存储连接字符串的最佳方式是在 app.config 或 appsettings.json 文件中,具体取决于您使用的 .NET 版本以及代码中的调用方式,如下所示:

    string connectionString = ConfigurationManager.ConnectionStrings["student_info"].ConnectionString;
    

【讨论】:

    【解决方案2】:

    一个选项是为您的数据操作创建一个类。对于插入,使用命名值元组返回成功,失败时返回异常,如果您在表中设置了自动递增列,则可选择返回新标识符。

    以下内容足以让您了解如何考虑执行新记录插入。此代码是使用 C#9、.NET Framework Core 编写的,如果使用 .NET Framework 4.8 或更低版本,则需要对代码进行一些调整。

    备注

    • 首先在 Visual Studio 或 SSMS(SQL-Server Management Studio)以确保该语句在您的代码之外工作。对传递给 INSERT 语句的每个参数使用 DECLARE。
    • 首先验证传递给插入方法的数据,以确保有可接受的值。这可能是简单的断言或在类的属性上使用数据注释。

    基础学校课程(是的,它缺少许多属性)

    public class SchoolClass
    {
        public string SchoolName { get; set; }
        public string ParentContact { get; set; }
    }
    

    数据操作类

    public class Operations
    {
        public static string ConnectionString
            => "Data Source=DESKTOP-GH4DT15\\MSSQLSERVER01;Initial Catalog=RDO Student info; Integrated Security=True;";
    
        /// <summary>
        /// Insert a new record, in this case only enough is done
        /// for you to consider this as one possible methods to
        /// check if the insert worked, if not check the exception
        /// and if worked use the new identifier
        /// </summary>
        /// <param name="schoolClass"></param>
        /// <returns>
        /// Tuple
        ///     success = operation was successful or failed
        ///     exception = if success is false, check exception else use identifier
        ///     identifier = new identifier (assuming auto-incrementing primary column)
        /// </returns>
        public static (bool success, Exception exception, int identifier) InsertRecord(SchoolClass schoolClass)
        {
            try
            {
                using var cn = new SqlConnection(ConnectionString);
                using var cmd = new SqlCommand(
                    "INSERT INTO student_info (SchoolName,ParentContact) VALUES (@SchoolName,@ParentContact);SELECT CAST(scope_identity() AS int);", cn);
    
                cmd.Parameters.Add("@SchoolName", SqlDbType.Text).Value = schoolClass.SchoolName;
                cmd.Parameters.Add("@ParentContact", SqlDbType.Text).Value = schoolClass.ParentContact;
                var id = Convert.ToInt32(cmd.ExecuteScalar());
                cn.Open();
                
                return (true, null, id);
            }
            catch (Exception exception)
            {
                return (false, exception, 0);
            }
        }
        
    }
    

    在单元测试方法中完成使用(这不是真正的正确测试,只是将代码与用户界面隔离),将 Console.WriteLine 替换为 MessageBox 并可能写入日志文件。

    [TestMethod]
    public void InsertSchoolRecord()
    {
        var schoolRecord = new SchoolClass();
    
        var (success, exception, identifier) = Operations.InsertRecord(schoolRecord);
        if (success)
        {
            // all is good
        }
        else
        {
            Console.WriteLine(exception.Message);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 2020-08-07
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多