我有一个WCF服务,我想从中返回一个DataTable.我知道这往往是一个备受争议的话题,至于返回DataTables是否是一个好习惯.让我们暂时搁置一下.
当我从头开始创建DataTable时,如下所示,没有任何问题.该表已创建,填充并返回给客户端,一切都很好:
[DataContract]
public DataTable GetTbl()
{
DataTable tbl = new DataTable("testTbl");
for(int i=0;i<100;i++)
{
tbl.Columns.Add(i);
tbl.Rows.Add(new string[]{"testValue"});
}
return tbl;
}
Run Code Online (Sandbox Code Playgroud)
但是,只要我出去打开数据库来创建表,如下所示,我得到一个CommunicationException"底层连接已关闭:连接意外关闭."
[DataContract]
public DataTable GetTbl()
{
DataTable tbl = new DataTable("testTbl");
//Populate table with SQL query
return tbl;
}
Run Code Online (Sandbox Code Playgroud)
该表正在服务器端正确填充.它比我循环并返回的测试表要小得多,并且查询小而快 - 这里没有超时或大数据传输的问题.正在使用相同的功能和DataContracts/ServiceContracts/BehaviorContracts.
为什么填充表的方式对表成功返回有什么影响?
您如何确定Excel中第n列的列名(例如"AQ"或"BH")?
编辑:一种语言无关的算法,以确定这是这里的主要目标.
可以从.NET调用标量值函数,如下所示:
SqlCommand cmd = new SqlCommand("testFunction", sqlConn); //testFunction is scalar
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("retVal", SqlDbType.Int);
cmd.Parameters["retVal"].Direction = ParameterDirection.ReturnValue;
cmd.ExecuteScalar();
int aFunctionResult = (int)cmd.Parameters["retVal"].Value;
Run Code Online (Sandbox Code Playgroud)
我也知道可以以类似的方式调用表值函数,例如:
String query = "select * from testFunction(param1,...)"; //testFunction is table-valued
SqlCommand cmd = new SqlCommand(query, sqlConn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(tbl);
Run Code Online (Sandbox Code Playgroud)
我的问题是,可以将表值函数作为存储过程调用,就像标量值函数一样吗?(例如,复制我的第一个代码片段,调用一个表值函数,并通过ReturnValue参数获取返回的表).
我们使用AutoSys进行作业调度,我发现自己编写了大量的JIL(作业指令语言)脚本来删除框并重新插入它们,因为工作量变化很小(例如开始时间等).是否有可以使用的更新命令?CA的AutoSys 备忘单上没有任何信息.
想象一下,您正在使用的对象具有与其关联的其他对象的集合,例如,WinForm上的Controls集合.您想要检查集合中的某个对象,但该集合没有Contains()方法.有几种方法可以解决这个问题.
Contains()通过循环遍历集合中的所有项来实现您自己的方法,以查看其中一个是否是您正在寻找的.这似乎是"最佳实践"方法.Run Code Online (Sandbox Code Playgroud)try { Object aObject = myCollection[myObject]; } catch(Exception e) { //if this is thrown, then the object doesn't exist in the collection }
我的问题是你认为第二种选择的编程习惯有多差,为什么?它的性能与集合中的循环相比如何?
我正在使用Visual Studio Tools for Office(2008)开发Excel 2007加载项.我有一张包含多个ListObjects的工作表,它们在启动时绑定到数据表.当它们被绑定时,它们会正确自动调整大小.
他们被重新绑定时会出现问题.我在功能区栏上有一个自定义按钮,它返回到数据库,并根据用户输入的某些条件检索不同的信息.这个新数据返回并重新绑定到ListObjects - 但是,这次它们没有调整大小并且我得到一个异常:
无法绑定ListObject,因为无法调整其大小以适合数据.ListObject无法添加新行.这可能是由于无法移动列表对象下方的对象而引起的.
内部异常:"Range类的插入方法失败"
原因:Microsoft.Office.Tools.Excel.FailureReason.CouldNotResizeListObject
我无法在Google或MSDN上找到关于此错误的任何有意义的内容.我一直试图弄清楚这一点,但无济于事.
基本代码结构:
//at startup
DataTable tbl = //get from database
listObj1.SetDataBinding(tbl);
DataTable tbl2 = //get from database
listObj2.SetDataBinding(tbl2);
//in buttonClick event handler
DataTable tbl = //get different info from database
//have tried with and without unbinding old source
listObj1.SetDataBinding(tbl); <-- exception here
DataTable tbl2 = //get different info from database
listObj2.SetDataBinding(tbl2);
Run Code Online (Sandbox Code Playgroud)
请注意,即使ListObject正在缩小,并且不仅在它增长时,也会发生此异常.
我试图在Silverlight和WCF服务之间来回传递一些图像.如果可能的话,我想传递一个System.Windows.Media.Imaging.BitmapImage,因为这意味着客户端不需要进行任何转换.
但是,在某些时候我需要将此图像存储在数据库中,这意味着图像表示必须能够转换为和从中转换byte[].我可以创建一个BitmapImage从byte[]通过读取所述阵列成MemoryStream和使用BitmapImage.SetSource().但我似乎无法找到一种方法,另一种方式转换-从BitmapImage到byte[].我错过了一些明显的东西吗?
如果它有帮助,转换代码可以在服务器上运行,即它不需要是Silverlight安全的.
Stata知识库包含有关从管道读取ASCII数据的注释,这将使人们无需在磁盘上存储解压缩版本即可读取文件。我们从未成功使用此处显示的方法-我总是收到错误消息
mypipe.pip: not found。我们有TB级的数据可以很好地压缩,因此这总是令人失望的。我们很想听听它是否对其他人有用。
在调查此问题时,我们发现了一种解决方法,它似乎好得多。与知识库建议不同,除ASCII文件外,它还可以与.dta文件一起使用。这对我们来说非常有趣。这是通过use命令的http选项完成的
。
我们的第一次尝试是将文件test.cgi添加到我们的webservers cgi-bin目录中:
#!/bin/sh
echo Content-type: application/x-stata
/usr/bin/zcat /data/sample.dta.gz
Run Code Online (Sandbox Code Playgroud)
我们发现
use http://www.nber.org/test
Run Code Online (Sandbox Code Playgroud)
该文件可以从Stata上使用,但是由于文件多次在LAN上鞭打,因此涉及很多开销,因此我们没有追求从URL中获取文件名或使其实用。
我们正在开发一种替代方案,它不需要实际的Web服务器,甚至不需要root权限。这是通过大多数Linux发行版附带的nc命令完成的,并且也可用于Windows。在Stata提示符下,运行compound命令:
.! (echo -ne "HTTP/1.0 200 OK\r\n\r\n"; zcat /data/sample.dta.gz;) | nc -l 8080 &
Run Code Online (Sandbox Code Playgroud)
此命令设置计算机以将标头和解压缩的文件传输到从端口8080读取的第一个进程。由于8080是高端口,因此不需要特殊权限即可使用它。直到从该端口读取文件时,此命令才会返回,此时它将向您显示确切的Stata请求。因为&状态,而nc等待。然后
. use http://127.0.0.1:8080
Run Code Online (Sandbox Code Playgroud)
请注意,您不能使用“ localhost”而不是127.0.0.1,因为该use命令将不接受一部分主机名。
如果您的计算机上没有nc,请查找ncat,netcat或socat。某些版本的端口号之前需要'-p'。您可以在Windows计算机上安装nc,并且应该能够执行相同的操作,但是我们尚未尝试过。
这也可以用于ascii文件,加密文件,拆分文件,也许还有其他类型。如果仅统计/传输将写入标准输出!
有一个安全问题-您放弃Unix权限位中的读取限制。它比从磁盘读取未压缩的文件还慢,但是对我们来说仍然足够快。
我们一直试图将其打包到一个ado文件中,但没有成功,因为一个用户友好的ado程序将需要自行查找可用的端口,我们还没有找到一个很好的方法来进行通信。它返回到use命令,对此我们也不知所措。我希望列表中的某个人可能会被启发提出一种方法,或者Statacorp可能只是将解压缩合并到use命令中。
丹尼尔·芬伯格feenberg@nber.org
那里有许多词法分析器和解析器生成器 - lex/flex和yacc/bison,jflex和javacup,gplex和gppg等.我想知道官方语言开发人员使用什么工具 - Sun和Microsoft使用任何工具这些在开发Java和.NET中,或者那些大小的商店只使用自定义内部工具吗?
c# ×6
.net ×4
excel ×2
algorithm ×1
autosys ×1
bitmapimage ×1
bytearray ×1
compilation ×1
data-binding ×1
datatable ×1
java ×1
netcat ×1
scheduler ×1
silverlight ×1
sql ×1
stata ×1
vsto ×1
wcf ×1
web-services ×1