Как показать значение, напечатанное 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
этот запрос либо вернет мне либо количество затронутых строк, либо дублировать
Я хочу использовать этот дубликат в C# in 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.Шоу(д-р);
что нужно делать?
2 ответов
использование ADO.NET существует четыре варианта возврата информации из SQL-запроса:
- используйте объект DataSet для сбора возвращаемых строк и работы с этими строками в дополнение к возвращаемым значениям и возвращаемым параметрам.
- используйте объект DataReader для сбора возвращаемых строк, перемещения по этим строкам, а также для сбора возвращаемых значений и возвращаемых параметров.
- используйте метод ExecuteScalar для возврата значения из первого столбца первая строка результатов с возвращаемыми значениями и возвращаемыми параметрами. Это наиболее полезно для агрегатных функций.
- используйте метод ExecuteNonQuery для возврата только возвращаемых параметров и возвращаемых значений. Все возвращенные строки отбрасываются. Это наиболее полезно для выполнения запросов.
Это все методы, вызываемые из вашего объекта command.
есть много разных способов кожи кошки, вы можете использовать выходные параметры, вы можете использовать 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 довольно громоздким. Поэтому, хотя мой ответ должен быть звучным в целом, вам, вероятно, придется проработать некоторые детали, чтобы заставить его работать именно так, как вам нужно.
несколько лет спустя, но вы должны иметь возможность получить текст печати / информации (как просил) путем присоединения eventhandler к событие 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
}