我注意到从IDataReader
使用声明中读取一些我无法理解的好奇心.虽然我确信答案很简单.
为什么在内部using (SqlDataReader rd) { ... }
如果我直接执行一个yield return
阅读器在阅读期间保持打开状态.但是,如果我执行直接return
调用SqlDataReader扩展方法(如下所述),读者在枚举可以实现之前关闭?
public static IEnumerable<T> Enumerate<T>(this SqlDataReader rd)
{
while (rd.Read())
yield return rd.ConvertTo<T>(); //extension method wrapping FastMember
rd.NextResult();
}
Run Code Online (Sandbox Code Playgroud)
为了完全清楚我在问什么,我不确定为什么以下内容根本不同:
一个充实的例子,根据@ TimSchmelter的要求:
/*
* contrived methods
*/
public IEnumerable<T> ReadSomeProc<T>() {
using (var db = new SqlConnection("connection string"))
{
var cmd = new SqlCommand("dbo.someProc", db);
using(var rd = cmd.ExecuteReader())
{
while(rd.Read())
yield return rd.ConvertTo<T>(); //extension method wrapping FastMember
}
}
}
//vs
public IEnumerable<T> ReadSomeProcExt<T>() …
Run Code Online (Sandbox Code Playgroud) 我禁用了所有扩展,只打开了1个Sql Project.但每当我关闭SQL文件时,Visual Studio都会挂起.
受影响的版本
- 2017年企业
- 2015年企业
在此"挂起时间"期间,Visual Studio具有"无响应"状态.
它似乎也保持锁定的时间与关闭/打开的文件数量相关.
编辑:使用SafeMode中的devenv重现
思考?
visual-studio sqlproj sql-server-data-tools visual-studio-2015 visual-studio-2017
我正在尝试从PowerShell脚本中读取SQL表中的数据.我可以在reader对象中看到数据,但是在使用While (readerobject.read()){}
它时,它不会进入循环内部.
Powershell:
$cmd = $sqlConn.CreateCommand()
$cmd.CommandText ="SELECT * from user"
$movedUserDetails = $cmd.ExecuteReader()
while ($movedUserDetails.Read())
{
"[0] : " + $movedUserDetails.GetValue(0)
}
$movedUserDetails.Close()
Run Code Online (Sandbox Code Playgroud) 希望仅查询日期人遇到过这个?
示例代码:
////MODEL
module.exports = {
attributes: {
date: {
type: 'date',
required: true
}
}
};
////CONTROLLER
var today = moment().toISOString();
var queryObj = { date: today };
var newDay = { date: today };
Day.findOrCreate(queryObj, newDay).exec(function(err, day) {
console.log(day)
});
Run Code Online (Sandbox Code Playgroud)
显然,这会在每次刷新时创建一条新记录,因为iso字符串将随着每秒的变化而变化.
谢谢您的帮助!
有人知道with (nolock)
在使用时是否可以告诉dapper追加connection.GetList<TView>()
?
我使用它作为我的CQRS模型中的R并且它运行良好但我现在担心我们正在做更多的重读,它将开始锁定表.如果可能的话,我宁愿不在混合中添加交易.
我使用SSMS v17.6与SQL Server Express v14.0.1000.169.
当我运行以下DELETE
语句时:
delete from foo
go
Run Code Online (Sandbox Code Playgroud)
我收到错误:
'go'附近的语法不正确.
但是如果我执行类似的SELECT
声明:
select * from foo
go
Run Code Online (Sandbox Code Playgroud)
然后没有错误.
似乎错误发生在任何不返回结果的语句中.我已经检查了SSMS中的查询执行设置,批处理分隔符设置为go.SSMS似乎正在向服务器发送它不应该做的事情.
我在多台机器上看过这个.
可以使用以下方法“在可能的情况下”强制使用表达式主体:
Tools -> Options -> Text Editor -> C# -> Code Style -> General -> Expression preferences
但是,我无法确定(或找到)将主体强制到新线上的旋钮。
public int GetNum() => 1;
// vs
public int GetNum() =>
1;
Run Code Online (Sandbox Code Playgroud) 假设我有一个名为 的脚本schema.sql
,用于使用我想要的模式分配一个新的 SQLite 数据库。
如果此脚本PRAGMA journal_mode = 'wal';
之前包含任何 DML,数据库是否会持续设置为 WAL 模式?或者日志模式是否需要在每个连接/命令上配置?
我有一个表格X,上面有一个accountNo列表.该字段(accoutNo)是nvarchar(8).现在问题是我们有时会在这个字段中获得字符,我想将它转换为bigint.
对不起,我不能在这里用表格格式.
我能够检查accountNo是否是数字值:
select x.accountNo from x where ISNUMERIC(x.accountNo)=1
Run Code Online (Sandbox Code Playgroud)
但是当我尝试仅转换值时,如果accountNo是数字,我仍然不能,我很困惑:
select x.accountNo, convert(bigint,x.accountNo) from x where ISNUMERIC(x.accountNo)=1
Run Code Online (Sandbox Code Playgroud)
我收到的具体错误:
消息8114,级别16,状态5,行1错误将数据类型nvarchar转换为bigint.
accountNo A0001001 A0001002 A0001003 /0005856 !0005046 ~0005872 A.005698 A/005623 A./00578 ./214536
Run Code Online (Sandbox Code Playgroud) sql-server ×3
ado.net ×2
c# ×2
ssms ×2
asp.net-mvc ×1
dapper ×1
ienumerable ×1
nolock ×1
powershell ×1
sails-mongo ×1
sails.js ×1
sql ×1
sqlite ×1
sqlproj ×1
t-sql ×1
waterline ×1
yield-return ×1