试图弄清楚它是否最好使用,ExecuteScalar或者ExecuteNonQuery我是否想要返回新插入行的标识列.我已经阅读了这个问题并且我理解那里的差异,但是当我查看几周前我写的一些代码时(虽然从这个网站大量借用)我发现在我使用的插件中ExecuteScalar,就像这样:
public static int SaveTest(Test newTest)
{
var conn = DbConnect.Connection();
const string sqlString = "INSERT INTO dbo.Tests ( Tester , Premise ) " +
" VALUES ( @tester , @premise ) " +
"SET @newId = SCOPE_IDENTITY(); ";
using (conn)
{
using (var cmd = new SqlCommand(sqlString, conn))
{
cmd.Parameters.AddWithValue("@tester", newTest.tester);
cmd.Parameters.AddWithValue("@premise", newTest.premise);
cmd.Parameters.Add("@newId", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.CommandType = CommandType.Text;
conn.Open();
cmd.ExecuteScalar();
return (int) cmd.Parameters["@newId"].Value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这对我需要的东西很好,所以我很想知道
ExecuteNonQuery …我收到错误"无法隐式转换类型'int?' 到'int'.在返回行的OrdersPerHour上存在显式转换(你是否错过了演员?)我不确定为什么,因为我的C#技能不是那么先进.任何帮助,将不胜感激.
static int OrdersPerHour(string User)
{
int? OrdersPerHour;
OleDbConnection conn = new OleDbConnection(strAccessConn);
DateTime curTime = DateTime.Now;
try
{
string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > #" + curTime.AddHours(-1) + "# AND User = '" + User + "' AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered');";
OleDbCommand dbcommand = new OleDbCommand(query, conn);
dbcommand.Connection.Open();
dbcommand.CommandType = CommandType.Text;
OrdersPerHour = (int?)dbcommand.ExecuteScalar();
Console.WriteLine("Orders per hour for " + User + " …Run Code Online (Sandbox Code Playgroud) 我有一个SQL查询,它只返回一个字段 - 一个INT类型的ID.
我必须在C#代码中将其用作整数.
哪种方式更快,占用内存更少?
int id;
if(Int32.TryParse(command.ExecuteScalar().ToString(), out id))
{
// use id
}
Run Code Online (Sandbox Code Playgroud)
要么
int? id = (int?)command.ExecuteScalar();
if(id.HasValue)
{
// use id.Value
}
Run Code Online (Sandbox Code Playgroud)
要么
int? id = command.ExecuteScalar() as int?;
if(id.HasValue)
{
// use id.Value
}
Run Code Online (Sandbox Code Playgroud) 我正在使用LLBLGEN,其中有一个方法来执行查询scalar query.谷歌搜索给了我一个定义scalar sub-query,它们是一样的吗?
我正在尝试向DataRowC#中的现有列添加列.之后,该列将填充我的数据库中的单个值.
DataRow dr已存在且列"COLNAME"也存在.
comTBP是我的SqlCommand.
dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar());
Run Code Online (Sandbox Code Playgroud)
如果我的数据库中有值,并且ExecuteScalar()可以获得该值,则一切正常.如果我在我的开发服务器(本地)上测试此代码,如果ExecuteScalar()返回null或DBNull并且我的新列的值为0,它也可以工作.但是如果我将代码部署到生产服务器,则会出现问题.如果我做同样的事情,使用相同的数据库,它会抛出一个异常,并显示一条消息,它无法将DBNull转换为Int32.
我的问题是为什么这个错误出现在生产服务器上而不是我的本地开发服务器上?
我有一个代码如下所示,我尝试将数据插入表中并返回新元素的ID(由自动增量给出).
int newEquipmentID = new int();
query = database.ParameterizedQueryString("INSERT INTO Equipment (EquipmentTypeID) VALUES ({0})", "equipmenttypeID");
newEquipmentID = (int)database.Connection.ExecuteScalar(query, DefaultTimeout, equipment.EquipmentTypeID);
Run Code Online (Sandbox Code Playgroud)
但它失败并返回null,就好像尚未添加新项目一样.但实际上我可以看到新项目在数据库中进行简单的咨询.
我的问题是"何时"将数据实际添加到数据库中,如何获取新添加项目的ID.谢谢!
我有一批sql语句,如...
插入.... ; 插入.... ; 删除.........;
等等
当我尝试对oracle执行它们时它给了我这个错误(ORA-00911无效字符)
现在我可以理解这是因为语句之间的分号,我在SQL Server上尝试了这个并且它起作用但是在Oracle中没有运气到目前为止.
有没有办法使用ExecuteScalar或其他一些函数对oracle运行多个语句?
DUPLICATE:如何使用.NET执行多个Oracle SQL语句
你能用吗?
int blah = Convert.ToInt32(cmd.ExecuteScalar());
Run Code Online (Sandbox Code Playgroud)
当sproc的最后一个语句执行时:
RETURN @value
Run Code Online (Sandbox Code Playgroud)
我只能这样做才能发挥作用:
SELECT @value
此外,这给了我一个对象null异常:
int blah = (int)cmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)
是不是convert.toint32和(int)相同的东西,但一个是另一个的包装?
手册说应该使用ExecuteScalar方法,如:
public T ExecuteScalar<T>(
string commandText,
CommandType commandType,
params DbParameter[] parameters
)
Run Code Online (Sandbox Code Playgroud)
但是如何创建参数数组呢?我需要提供我的存储过程2个参数.
最近我注意到有趣的行为.
当使用SqlCommand.ExecuteScalar()运行MS SQL存储过程时,我的应用程序似乎完全不知道在SELECT完成后出现的任何SQL错误或PRINT .
最可能的解释是,在任何SELECT结果出现后立即向C#提供流控制,而不等待存储过程完成(尽管存储过程继续在下面静默执行).
显而易见的优势是性能提升(无需等待,因为结果已经知道),遗憾的是C#app并不知道在此之后可能发生的任何SQL异常.
有谁可以证实我的解释?这种行为会被改变吗?