嘿伙计们我想执行我的SQL语句但是我遇到语法问题,有人可以帮我理解我做错了吗?
谢谢,Ash。
public void AddToDatabase(string[] WordArray, int Good, int Bad, int Remove)
{
for (int WordCount = 0; WordCount < WordArray.Length; WordCount++)
{
string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (" + WordArray[WordCount] + ", " + Good + ", " + Bad + ", " + Remove + ")";
Debug.Print(sSQL);
//Private m_recordset As ADODB.Recordset
//Private m_connection As ADODB.Connection
ADODB.Recordset RS;
ADODB.Connection CN ;
CN = new ADODB.Connection();
RS = new ADODB.Recordset();
CN.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=doom_calc_dict.mdb;jet OLEDB:database";
CN.Open(CN.ConnectionString,"","",0);
object dummy = Type.Missing;
CN.Execute(sSQL,out dummy,0);
RS.Close();
CN.Close();
//string sSQL = "SELECT Word FROM WordDef WHERE Word='" + WordArray[WordCount] + "'";
DatabaseTools.LoadDataFromDatabase(sSQL);
//DatabaseTools.LoadDataFromDatabase(sSQL);
}
}
答案 0 :(得分:18)
您需要解决的最重要的事情是使用查询参数而不是动态构建字符串。这将改善性能,维护和安全性。
此外,您希望使用较新的强类型ADO.Net对象。确保为System.Data.OleDb
添加using指令。
请注意此代码中的using
语句。当您完成连接时,他们将确定您的连接已关闭。这很重要,因为数据库连接是有限的非托管资源。
最后,您并没有在代码中使用数组。您真正关心的是能够迭代一组单词,因此您希望接受IEnumerable<string>
而不是数组。不要担心:如果您需要传递数组,此函数将接受数组作为参数。
public void AddToDatabase(IEnumerable<string> Words, int Good, int Bad, int Remove)
{
string sql = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (@Word, @Good, @Bad, @Remove)";
using (OleDbConnection cn = new OleDbConnection("connection string here") )
using (OleDbCommand cmd = new OleDbCommand(sql, cn))
{
cmd.Parameters.Add("@Word", OleDbType.VarChar);
cmd.Parameters.Add("@Good", OleDbType.Integer).Value = Good;
cmd.Parameters.Add("@Bad", OleDbType.Integer).Value = Bad;
cmd.Parameters.Add("@Remove", OleDbType.Integer.Value = Remove;
cn.Open();
foreach (string word in Words)
{
cmd.Parameters[0].Value = word;
cmd.ExecuteNonQuery();
}
}
}
还有一件事:在OleDb中使用查询参数时,务必确保按顺序添加它们。
更新:修复了在VS 2005 / .Net 2.0上工作(依赖于VS 2008功能)。
答案 1 :(得分:3)
起初会显示我没有帮助。但事实上,我正在努力帮助你,所以请你这样做。您需要阅读this和this STAT!完成后,这里有一些很好的,干净的ADO.NET examples。
答案 2 :(得分:0)
试试这个(你应该尝试从应用程序外部运行SQL):
string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES ('" + WordArray[WordCount] + "', " + Good + ", " + Bad + ", " + Remove + ");";
答案 3 :(得分:0)
您需要在SQL语句的第一个参数周围添加单引号。
string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES ('" + WordArray[WordCount] + "', " + Good + ", " + Bad + ", " + Remove + ")";
字符和日期字段要求使用“单引号”
包围值答案 4 :(得分:0)
不,你需要这样:
string query = "INSERT INTO Table_PersonInfo
(PersonID,Surname
,[Family Name]
,AddsOnName
,Street,Number
,PostalCode
,[City of Birth]
,[Year of Birth]
,[Phone Number])
VALUES
('"+@personID+"'
, '"+ @surname + "'
, '"+@familyname+"'
, '"+@nameExtension+"'
, '"+@street+"'
, '"+@houseNumber+"'
, '"+ @postalCode+"'
, '"+@yearofbirth+"'
, '"+@placeofbirth+"'
, '"+@phoneNumber+"')";