C# ExecuteOnQuery、ExecuteReader和SqlDataAdapter插入查询3次
这就是我在需要的每一页中使用它的方式C# ExecuteOnQuery、ExecuteReader和SqlDataAdapter插入查询3次,c#,asp.net,sql-server,C#,Asp.net,Sql Server,这就是我在需要的每一页中使用它的方式 public static class db { public static string databaseName = "blue_pumpkin"; public static Temp query(string qr) { var s = new Temp(); s.query(qr); return s; } } public class Con { stat
public static class db
{
public static string databaseName = "blue_pumpkin";
public static Temp query(string qr)
{
var s = new Temp();
s.query(qr);
return s;
}
}
public class Con
{
static SqlConnection sc = null;
public static SqlConnection connect()
{
if (sc == null)
{
sc = new SqlConnection("server=localhost\\SQLEXPRESS;database=" + db.databaseName + ";Integrated Security=True;");
}
return sc;
}
}
public class Temp
{
private SqlConnection con;
private string sqlQuery = "";
private DataTable dataset = new DataTable();
public long last_insert_id = -1;
public int rows_affected = -1;
public int num_rows = 0;
public int num_columns = 0;
public Boolean hasRows = false;
public void query(string qr)
{
this.sqlQuery = qr;
this.con = Con.connect();
this.con.Open();
SqlCommand cd = new SqlCommand(this.sqlQuery, this.con);
try {
this.rows_affected = cd.ExecuteNonQuery();
} catch (Exception e) {
this.rows_affected = -1;
}
SqlDataReader reader = cd.ExecuteReader();
this.hasRows = reader.HasRows;
reader.Close();
SqlDataAdapter sda = new SqlDataAdapter(cd);
sda.Fill(this.dataset);
this.num_rows = this.dataset.Rows.Count;
this.num_columns = this.dataset.Columns.Count;
string sql = "SELECT SCOPE_IDENTITY();";
SqlCommand cmd = new SqlCommand(sql, this.con);
try {
this.last_insert_id = Convert.ToInt64(cmd.ExecuteScalar());
} catch (Exception e) {
this.last_insert_id = -1;
}
this.con.Close();
}
public DataTable getDataTable()
{
return this.dataset;
}
}
var b=db.query(“从[“+db.databaseName+”].[dbo].[registration]]中选择*”;
写入(“最后一个id:+b.Last\u insert\u id.ToString()+”
”;
Write(“hasRows:+b.hasRows.ToString()+”
”;
Write(“num\u columns:+b.num\u columns.ToString()+”
”;
Write(“num_rows:+b.num_rows.ToString()+”
”;
Write(“受影响的行:+b.rows\u受影响的.ToString()+”
”;
var c=db.query(“更新[“+db.databaseName+”].[dbo].[registration]设置注册表密码='Pune'”+
“其中reg_id=1;”;
Write(“Last id:+c.Last\u insert\u id.ToString()+”
”;
Write(“hasRows:+c.hasRows.ToString()+”
”;
Write(“num\u columns:+c.num\u columns.ToString()+”
”;
Write(“num_rows:+c.num_rows.ToString()+”
);
Write(“受影响的行:+c.rows\u受影响的.ToString()+”
”;
var queryString=“插入[“+db.databaseName+”][dbo].[registration]([reg\u name],[reg\u age],[reg\u gender],”+
“[注册创建日期],[注册电子邮件],[注册密码],[注册已批准])值”+
“(“+reg_name+”、“+reg_age+”、“+reg_gender+”、GETDATE()、“+reg_email+”、”+
““+reg_密码+”,0)”;
db.query(queryString);
//或
DataTable dt=db.query(“从[“+db.databaseName+”][dbo].[registration]中选择*,其中[reg_id]=1”).getDataTable();
由于ExecuteNonQuery
、ExecuteReader
和SqlDataAdapter
的原因,除了运行insert-query它insert 3次之外,其他一切都正常工作
如果我单独运行它们,效果很好,但是如果我同时运行它们,它们会插入3次。因为我想在同一个函数中运行所有类型的查询,是否有任何方法可以使它同时运行所有3个查询,并且只插入一次查询,而不影响更新、删除或不同模式的查询
我能想到的一件事是单独为插入数据创建
insertQuery()
函数。但是如果有人能给我一个比我更好的主意,我将非常欢迎。问题是,在您的查询方法中,这三行正在执行insert语句
var b = db.query("SELECT * FROM [" + db.databaseName + "].[dbo].[registration] ");
Response.Write("Last id : " + b.last_insert_id.ToString() + "<br>");
Response.Write("hasRows : " + b.hasRows.ToString() + "<br>");
Response.Write("num_columns : " + b.num_columns.ToString() + "<br>");
Response.Write("num_rows : " + b.num_rows.ToString() + "<br>");
Response.Write("rows_affected : " + b.rows_affected.ToString() + "<br>");
var c = db.query("UPDATE [" + db.databaseName + "].[dbo].[registration] SET reg_password = 'Pune'" +
"WHERE reg_id = 1; ");
Response.Write("Last id : " + c.last_insert_id.ToString() + "<br>");
Response.Write("hasRows : " + c.hasRows.ToString() + "<br>");
Response.Write("num_columns : " + c.num_columns.ToString() + "<br>");
Response.Write("num_rows : " + c.num_rows.ToString() + "<br>");
Response.Write("rows_affected : " + c.rows_affected.ToString() + "<br>");
var queryString = "INSERT INTO [" + db.databaseName + "].[dbo].[registration] ([reg_name], [reg_age], [reg_gender], " +
" [reg_creation_date], [reg_email], [reg_password], [reg_is_approved]) VALUES" +
" ('"+ reg_name + "', '" + reg_age + "', '" + reg_gender + "', GETDATE(), '" + reg_email + "',"+
" '" + reg_password + "', 0)";
db.query(queryString);
//OR
DataTable dt = db.query("SELECT * FROM [" + db.databaseName + "].[dbo].[registration] WHERE [reg_id]=1").getDataTable();
您需要根据要执行的操作来分隔这些执行,例如,如果语句不是select,则只执行SqlCommand.ExecuteNonQuery方法,否则执行SqlDataAdapter.Fill方法
如果需要知道select语句是否有行或行数,可以使用以下代码而不使用SQLDataReader
this.rows_affected = cd.ExecuteNonQuery();
SqlDataReader reader = cd.ExecuteReader();
sda.Fill(this.dataset);
希望对你有用 是的,一个更好的想法是忘记使用一个方法来执行与数据库的所有可能的交互。Sql注入是最糟糕的一个,正确的解析是另一个。最后,未能正确处理连接是另一个大问题。请看一下如何编写参数化查询,以及像Connection这样的一次性对象的基本概念。你能给我提供任何我可以学习和纠正这些错误的链接吗?我来自php和javascript背景,我使用了很多var,因为我喜欢它。您还可以了解如何使用存储过程,而不是尝试在C#中构建存储过程。这里有一个数据库引擎,而不仅仅是一个存储库——使用它。
SqlCommand cd = new SqlCommand(sqlQuery, con);
DataTable dataTable = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter(cd);
sda.Fill(dataTable);
Boolean hasRows = (dataTable != null && dataTable.Rows.Count > 0);
Int32 noRows = (hasRows ? dataTable.Rows.Count : 0);