Как показать значение, напечатанное SQL-запросом в окне сообщения
Я хочу напечатать значение, которое возвращается SQL Server.
If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemNama')
BEGIN
INSERT INTO ItemList (ItemName) VALUES('txtItemNamea')
END
ELSE
BEGIN
Print 'Duplicate'
END
Этот запрос либо вернет мне количество затронутых строк, либо Duplicate
Я хочу использовать этот дубликат в C# в MessageBox.Show()
string query1 = "If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemName') BEGIN INSERT INTO ItemList (ItemName) VALUES('txtItemName') END ELSE BEGIN Print 'Duplicate' END";
SqlCommand cmd = new SqlCommand(query1, conn);
SqlDataReader dr;
conn.Open();
dr=cmd.ExecuteReader();
conn.Close();
MessageBox.Show(dr);
Я не знаю как пользоваться dr
сделать это. Пожалуйста, помогите мне напечатать Дубликат здесь
MessageBox.Show(д - р);
Что мне нужно сделать здесь?
2 ответа
В ADO.NET есть четыре варианта возврата информации из запроса SQL:
- Используйте объект DataSet для сбора возвращаемых строк и для работы с этими строками в дополнение к возвращаемым значениям и возвращаемым параметрам.
- Используйте объект DataReader для сбора возвращаемых строк, перемещения по этим строкам, а также для сбора возвращаемых значений и возвращаемых параметров.
- Используйте метод ExecuteScalar для возврата значения из первого столбца первой строки результатов с возвращаемыми значениями и возвращаемыми параметрами. Это наиболее полезно с агрегатными функциями.
- Используйте метод ExecuteNonQuery для возврата только возвращаемых параметров и возвращаемых значений. Все возвращенные строки отбрасываются. Это наиболее полезно для выполнения запросов действий.
Это все методы, вызываемые из вашего командного объекта.
Есть много разных способов сделать скин для кошки, вы можете использовать выходные параметры, вы можете использовать ExecuteScalar, вы можете использовать возвращаемые значения или вы можете использовать фиктивные наборы записей.
Вы должны иметь возможность что-то вроде следующего в вашем C#, чтобы получить возвращаемое значение из запроса
// add a new parameter, with any name we want - its for our own use only
SqlParameter sqlParam = com.Parameters.Add("@ReturnValue", SqlDbType.Int);
// set the direction flag so that it will be filled with the return value
myParm.Direction = ParameterDirection.ReturnValue;
Код выше фиксирует возвращаемое значение, которое вы можете установить по своему усмотрению, возможно, с 0 для существует и 1 для не существует.
If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemNama')
BEGIN
INSERT INTO ItemList (ItemName) VALUES('txtItemNamea')
Return 0;
END
ELSE
BEGIN
Return 1;
END
Однако с приведенным выше советом есть небольшая оговорка - я обычно либо использую ORM, такой как Linq-to-SQL или NHibernate, либо использую хранимые процедуры. Я считаю встроенный SQL довольно громоздким. Так что, хотя мой ответ должен быть в целом обоснованным, вам, вероятно, придется проработать некоторые детали, чтобы заставить его работать именно так, как вам нужно.
На несколько лет позже, но вы сможете получить текст для печати / информации (как первоначально просили), прикрепив обработчик событий к событию InfoMessage в объекте SqlConnection -
Но делайте это только в том случае, если вы не можете (по какой-то причине) использовать альтернативы, упомянутые в этой теме.
static void Main(string[] args)
{
using (SqlConnection connection = new SqlConnection(@"someconnectionstring"))
{
connection.Open();
using(SqlCommand command = new SqlCommand("test", connection))
{
connection.InfoMessage += new SqlInfoMessageEventHandler(connection_InfoMessage);
using (SqlDataAdapter adapter = new SqlDataAdapter(command))
{
DataTable dt = new DataTable();
adapter.Fill(dt); // Do something with DataTable
}
}
}
}
static void connection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
// e contains info message etc
}