0

我很确定我在这里只是愚蠢,但是哦,好吧。

我的代码是:

private void btnInsert_Click(object sender, EventArgs e)
{
        SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\LiftLog.mdf;Integrated Security=True;User Instance=True");
        conn.Open();

        SqlCommand cmdInsert = conn.CreateCommand();
        cmdInsert.CommandText = "INSERT INTO tblLog (Date, Time, Floor) VALUES (1011, 0011, 3)";
        cmdInsert.ExecuteNonQuery();
}

它正在连接到表,因为如果我没有将数据放入非空字段,它会抱怨。但是,当我单击按钮时,表格不会更新。

为什么?

这可以检索数据:

    System.Data.SqlClient.SqlConnection con;
    System.Data.SqlClient.SqlDataAdapter da;
    DataSet ds1;

    // Connects to database.
    private void Form1_Load(object sender, EventArgs e)
    {
        con = new System.Data.SqlClient.SqlConnection();
        ds1 = new DataSet();
        con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\LiftLog.mdf;Integrated Security=True;User Instance=True";
        con.Open();
        string sql = "SELECT * From tblLog";
        da = new System.Data.SqlClient.SqlDataAdapter(sql, con);
        da.Fill(ds1, "LogOutput");
        NavigateRecords();
        con.Close(); 
     }

由于 SSMS 对我不起作用,是否可以以某种方式修改它以插入?

另外,我知道清理输入等,我将其全部剥离以尝试查明问题。

4

1 回答 1

1

这整个User Instance 和 AttachDbFileName=方法是有缺陷的 - 充其量!Visual Studio 将围绕.mdf文件进行复制(复制到在 Visual Studio 中运行应用程序的项目的输出目录),并且很可能,您的INSERT工作正常 - 但您最终只是查看了错误的 .mdf 文件

如果您想坚持使用这种方法,请尝试在myConnection.Close()调用上设置断点 - 然后.mdf使用 SQL Server Mgmt Studio Express 检查文件(在项目的输出目录中) - 我几乎可以肯定您的数据在那里。

我认为真正的解决方案是

  1. 安装 SQL Server Express(反正你已经完成了)

  2. 安装 SQL Server Management Studio Express

  3. 在SSMS Express中创建您的数据库,给它一个逻辑名称(例如LiftLog

  4. 使用它的逻辑数据库名称(在服务器上创建它时给出)连接到它——不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:

    Data Source=.\\SQLEXPRESS;Database=LiftLog;Integrated Security=True
    

    其他一切都和以前完全一样...

另外,请注意:我强烈建议始终使用参数化查询来 a) 避免 SQL 注入攻击,b) 显着提高 SQL Server 的性能。

所以而不是:

cmdInsert.CommandText = "INSERT INTO tblLog (Date, Time, Floor) 
                         VALUES (1011, 0011, 3)";

你应该使用

cmdInsert.CommandText = "INSERT INTO tblLog (Date, Time, Floor) 
                         VALUES (@Date, @Time, @Floor)";

然后@Date, @Time, @Floor在您的对象上定义这些参数 ( )SqlCommand并以这种方式填写它们的值。

于 2012-12-01T16:32:02.650 回答