Я написал этот метод для минимизации long
чисел:
public string minifyLong(long value)
{
if (value >= 100000000000)
return (value / 1000000000).ToString("#,0") + " B";
if (value >= 10000000000)
return (value / 1000000000D).ToString("0.#") + " B";
if (value >= 100000000)
return (value / 1000000).ToString("#,0") + " M";
if (value >= 10000000)
return (value / 1000000D).ToString("0.#") + " M";
if (value >= 100000)
return (value / 1000).ToString("#,0") + " K";
if (value >= 10000)
return (value / 1000D).ToString("0.#") + " K";
return value.ToString("#,0");
}
INSERT INTO tablename (field1, field2)
SELECT 3, field1 FROM sourcetable
Один оператор SQL вместо одного на вставку. Не уверен, что это сработает для вашей реальной проблемы, но для приведенного вами примера это гораздо лучший запрос, чем выполнять их по одному.
С другой стороны, убедитесь, что ваш код использует параметризованные запросы вместо того, чтобы принимать строки как есть внутри инструкции SQL - ваш пример открыт для внедрения SQL.
Какую версию SQL Server вы используете? Проблема может быть в следующем:
(из http://msdn.microsoft.com/en-us/library/9kcbe65k.aspx )
При использовании версий SQL Server до SQL Server 2005, когда используется SqlDataReader, связанный SqlConnection занят обслуживанием SqlDataReader. Находясь в этом состоянии, с SqlConnection нельзя выполнять никакие другие операции, кроме его закрытия. Это так до тех пор, пока не будет вызван метод Close SqlDataReader.
Итак, если это является причиной вашей проблемы, вы должны сначала прочитать все данные, затем закрыть SqlDataReader и только после этого выполнить вставки.
Что-то вроде:
objCommand = new SqlCommand("SELECT field1, field2 FROM sourcetable", objConn);
objDataReader = objCommand.ExecuteReader();
List<object> values = new List<object>();
while (objDataReader.Read())
{
values.Add(objDataReader[0]);
}
objDataReader.Close();
foreach (object value in values)
{
objInsertCommand = new SqlCommand("INSERT INTO tablename (field1, field2) VALUES (3, '" + value + "')", objConn);
objInsertCommand.ExecuteNonQuery();
}
Чтобы его можно было легко утилизировать, я использую следующий шаблон кодирования:
`using (SqlConnection connection = new SqlConnection("your connection string"))
{
connection.Open();
using (SqlCommand cmd = connection.CreateCommand())
{
cmd.CommandText = "Select * from SomeTable";
using (SqlDataReader reader = cmd.ExecuteReader())
{
if(reader.HasRows)
{
while(reader.Read()){
// assuming that we've a 1-column(Id) table
int id = int.Parse(reader[0].ToString());
}
}
}
}
connection.Close()
}`
Лучшее решение: есть проблема только с вашим значением «CommandText». Пусть это будет SP или обычный Sql Query.
Проверка 1. Значение параметра, которое вы передаете в запросе Sql, не меняется и повторяется снова и снова в вашем ExecuteReader.
Проверка 2: строка запроса Sql сформирована неправильно.
Проверка 3: Пожалуйста, создайте самый простой код следующим образом.
string ID = "C8CA7EE2";
string myQuery = "select * from ContactBase where contactid=" + "'" + ID + "'";
string connectionString = ConfigurationManager.ConnectionStrings["CRM_SQL_CONN_UAT"].ToString();
SqlConnection con = new SqlConnection(connectionString);
con.Open();
SqlCommand cmd = new SqlCommand(myQuery, con);
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
con.Close();