我正在编写一个方法将Student插入到本地SQL数据库中,该数据库包含一个包含学生信息的表:
public void AddStudent(string name, string teachName, string pass)
{
string dbfile = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).DirectoryName + "\\Logo.sdf";
SqlCeConnection connection = new SqlCeConnection("Data Source=" + dbfile + "; Password = 'dbpass2011!'");
connection.Open();
SqlCeTransaction transaction = connection.BeginTransaction();
SqlCeCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText = "INSERT INTO Students VALUES ('@name', '@id', '@pass', '@tname')";
command.Parameters.Add("@name", name);
command.Parameters.Add("@id", this.ID);
command.Parameters.Add("@pass", MD5Encrypt.MD5(pass));
command.Parameters.Add("@tname", teachName);
command.Prepare();
command.ExecuteNonQuery();
transaction.Commit();
connection.Dispose();
connection.Close();
}
每当我使用它时,当我查看数据库中Students表的内容时,它永远不会将数据插入表中。最初我有这个返回一个int所以我可以看到它影响了多少行,它总是返回1,所以我知道它正在工作。
我已经找到了这个问题的答案,类似问题的答案就是提问者正在查看错误的.sdf文件。我已经确定我正在查看正确的文件。
非常感谢任何反馈!
答案 0 :(得分:4)
command.CommandText = "INSERT INTO Students VALUES ('@name', '@id', '@pass', '@tname')";
你应该删除额外的单引号 - 这应该是:
command.CommandText = "INSERT INTO Students VALUES (@name, @id, @pass, @tname)";
此外,我不确定为什么要为单个插入打开事务 - 这也是不需要的。
答案 1 :(得分:2)
您的代码中很可能会引发异常;你需要添加一个try / catch处理程序和/或调试应用程序以确切地弄清楚发生了什么。
但是,您的代码至少存在两个问题:
在调用Prepare之前,请在要准备的语句中指定每个参数的数据类型。对于具有可变长度数据类型的每个参数,必须将Size属性设置为所需的最大大小。如果不满足这些条件,准备就会返回错误。
答案 2 :(得分:2)
您不需要将单引号放到参数化查询中,在参数化查询的情况下,将根据需要解析整个数据,
command.CommandText = "INSERT INTO Students VALUES (@name, @id, @pass, @tname)";
此外,最好明确设置参数类型,大小和值,如下所示:
SqlCeParameter param = new SqlCeParameter("@name", SqlDbType.NVarChar, 100);
param.Value = name; // name is a variable that contain the data of name field
//param.Value = 'Jhon Smith'; //Directly value also can be used
希望这会有所帮助,谢谢你的时间。