我正在编写连接数据库的C#应用程序,选择并将记录插回网络中的服务器。
但我有大约40k的记录,我的程序处理一个记录,如1秒钟。
我不知道如何提高性能。这是我的sql getter和inserter。有什么建议吗?
public bool insert_and_ConfirmSQL(String Query, String comments)
{
bool success = false;
NpgsqlCommand cmd = new NpgsqlCommand();
NpgsqlConnection mycon = new NpgsqlConnection();
string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
mycon.ConnectionString = connstring;
cmd = mycon.CreateCommand();
cmd.CommandText = Query;
mycon.Open();
int temp = 0;
try
{
temp = cmd.ExecuteNonQuery();
success = true;
}
catch
{
success = false;
}
finally
{
if (mycon.State.ToString() == "Open")
{
mycon.Close();
}
}
return success;
}
public String getString(String sql, NpgsqlConnection conn)
{
using (DataSet ds = new DataSet())
{
using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn))
{
da.Fill(ds);
if (ds.Tables.Count > 0)
{
DataTable dt = ds.Tables[0];
// check count of Rows
if (dt.Rows.Count > 0)
{
object o = dt.Rows[0][0];
if (o != DBNull.Value && o != null)
{
return o.ToString();
}
}
}
}
}
// Return default value
return "";
}
答案 0 :(得分:3)
没有机会帮助您使用sql语句,因为我们不了解它们。
唯一(猜测)可见的问题是你每次尝试使用新连接循环40K记录(你知道怎么做)。这两个例程都是作为您的代码提供的。那么你需要40K调用insert_and_ConfirmSQL和/或另外40K来调用getString例程吗?
如果你真的循环,那么更新你的代码只使用一个连接而不关闭它;使用数据集可以完成相同的操作(您必须在使用前清除它:ds.Clear())。
毋庸置疑,如果您的查询很大(就数据而言)和/或索引不包含查询,那么预计会出现延迟。
尝试这种方法并告诉我们。
答案 1 :(得分:2)
有时您可以使用sql Datareader而不是DataSet来提高性能。
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader(v=vs.100).aspx#Y0
然后,您可以在从数据库中读取数据时检查数据。
所以我用DataReader实现上面的代码并重新定时。
编辑:特别是那个getString方法。如果那个ds.Fill占用了40k行,这可能是你性能问题的原因。