在您的C#源代码或存储过程中保留SQL有哪些优点/缺点?我一直在与一位朋友讨论我们正在开发的一个开源项目(C#ASP.NET论坛).目前,大多数数据库访问都是通过在C#中构建SQL内联并调用SQL Server DB来完成的.所以我试图确定哪个特定项目最好.
到目前为止,我有:
代码中的优点:
存储过程的优点:
我尝试使用Reflection向我的Windows.Net应用程序添加一个插件系统; 但是当有依赖关系的插件时它会失败.
Addon类必须实现一个接口'IAddon'并拥有一个空构造函数.
主程序使用Reflection加载插件:
Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\Addon.dll");
Type t = assembly.GetType("Test.MyAddon");
ConstructorInfo ctor = t.GetConstructor(new Type[] { });
IAddon addon= (IAddon) ctor.Invoke(new object[] { });
addon.StartAddon();
Run Code Online (Sandbox Code Playgroud)
当addon不使用dependencie时,它工作得很好.但是如果我的插件引用并使用另一个在磁盘上的插件附近保存的DLL(C:\ Temp\TestAddon\MyTools.dll),则会失败:
System.IO.FileNotFoundException:无法加载文件或程序集'MyTools.dll '或其中一个依赖项.
我不想在我的可执行文件附近复制插件DLL,我怎么能告诉.Net运行时在"C:\ Temp\TestAddon"中搜索任何依赖?
请注意添加
Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\MyTools.dll");
Run Code Online (Sandbox Code Playgroud)
不要改变任何东西.
我们有一个TIBCO EMS解决方案,它在2-4服务器环境中使用内置服务器故障转移.如果TIBCO管理员将故障转移服务从一个EMS服务器转移到另一个EMS服务器,则应该在EMS服务级别自动将连接转移到新服务器.对于使用EMS服务的C#应用程序,这种情况不会发生 - 我们的用户连接在故障转移后没有转移到新服务器,我们不确定原因.
我们的应用程序仅在启动时连接到EMS,因此如果TIBCO管理员在用户启动应用程序后进行故障转移,则用户需要重新启动应用程序才能重新连接到新服务器(我们的EMS连接使用包含所有4个生产EMS服务器的服务器字符串 - 如果第一次尝试失败,它将移动到字符串中的下一个服务器并再次尝试).
我正在寻找一种自动化方法,如果检测到连接已经死亡,我会定期尝试重新连接到EMS,但我不确定如何最好地做到这一点.
有任何想法吗?我们正在使用TIBCO.EMS.dll版本4.4.2和.Net 2.x(SmartClient应用程序)
任何帮助,将不胜感激.
我最近在C#(.Net 2.0)中编写了一个DLL,其中包含一个需要IP地址的类.我的同事改变了类以从".dll.config"(XML)文件中检索IP - 这显然是由他创建的"应用程序设置"文件(Settings1.settings)自动生成的.这样做的好处是允许最终用户随意更改XML/config文件中的IP地址.
不幸的是,当我从树中检查他的代码并尝试编译(或使用)这个新代码时,任何调用此DLL的应用程序只获取默认值,而不是文件中的值.
调用配置文件的构造函数如下所示:
public class form : System.Windows.Forms.Form
{
public form()
{
// This call is required by the Windows Form Designer.
InitializeComponent();
IP = IPAddress.Parse(Settings1.Default.IPAddress);
}
}
Run Code Online (Sandbox Code Playgroud)
"旧"值(您在开发时定义的值)是硬编码的.如果franework无法访问或打开配置文件,它将使用默认值.如果您在dll中使用设置,这将始终发生.
这是否意味着我无法在配置文件中存储DLL的外部值?(我的同事以某种方式完成了这项工作......)
由于我的框架似乎无法访问或打开配置文件,我该如何找出它失败的原因?甚至可以检测到何时发生?
德克尔:这有点帮助.不幸的是,我正在将此DLL写入规范,因此我实际上无法访问应用程序的配置文件.如上所述,我的同事创建了"Settings 1 .settings"文件.我当时并不理解这一点,但现在似乎添加"1"会使其超出任何调用它的应用程序的设置空间.
我想我想弄清楚的是为什么DLL似乎没有找到位于同一目录旁边的配置文件.通过代码逐步跟踪不会显示任何内容.
顺便说一句,我可以将程序集的"输出类型"从"类库"更改为"Windows应用程序",并在我的DLL代码的开头添加以下行:
[STAThread]
public static void Main(string[] args)
{
System.Windows.Forms.Application.Run(new form());
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它会生成一个不同的配置文件(".exe.config"),我可以改变它并从文件中提取新数据.所以我有点困惑.有任何想法吗?
ODP.Net公开了将关联数组作为参数传递到C#的Oracle存储过程的能力.除非您尝试在sql查询中使用该关联数组中包含的数据,否则它是一个很好的功能.
原因是它需要上下文切换 - SQL语句需要SQL类型,并且传递到PL/SQL的关联数组实际上定义为PL/SQL类型.我相信在PL/SQL包/过程/函数中定义的任何类型都是PL/SQL类型,而在这些对象之外创建的类型是SQL类型(如果你可以提供更清晰的,请做但不是这个目标)题).
所以,问题是,您将使用什么方法将PL/SQL关联数组参数转换为可以在sql语句中使用的过程中的内容,如下所示:
OPEN refCursor FOR
SELECT T.*
FROM SOME_TABLE T,
( SELECT COLUMN_VALUE V
FROM TABLE( associativeArray )
) T2
WHERE T.NAME = T2.V;
Run Code Online (Sandbox Code Playgroud)
出于此示例的目的,"associativeArray"是由PLS_INTEGER索引的varchar2(200)的简单表.在C#中,associativeArry参数填充了字符串[].
除了使用关联数组之外,请随意讨论其他方法,但提前知道这些解决方案将不被接受.不过,我有兴趣看到其他选择.
我想知道在开发功能时是否有一种很好的方法可以挂钩到SharePoint 2007网站的Application_Start?我知道我可以直接编辑站点根目录中的Global.asax文件,但有没有办法实现这一点,以便它与该功能一起部署?
谢谢!
我们有一个内置在C#中的SmartClient,当它正在重新启动运行的PC时,它仍然保持打开状态.这将暂停重新启动过程,除非用户首先关闭SmartClient或进行其他一些手动干预.
当基础架构团队远程安装需要重新启动计算机的新软件时,这会导致问题.
让SmartClient应用程序从Windows识别关闭/重启事件并优雅地自杀的任何想法?
更新: 这是一个具有多个gui线程的高度线程化应用程序.是的,多个gui线程.它实际上是许多项目的整合,它们本身可以是独立的应用程序 - 所有这些都是从单个exe启动和管理的,这些exe集中了这些管理方法并跟踪这些线程.我不相信使用后台线程是一种选择.
最近遇到了这个问题...在VS.Net 2005中调试应用程序时,断点未连接.错误表示编译的代码与正在运行的版本不同,因此存在导致断点断开的不匹配.
清理所有bin文件的解决方案并重新编译没有帮助.不仅仅发生在一个盒子或人身上.
添加注意:此解决方案位于TFS for Source Control中.如果我删除我的本地TFS存储库并从头开始从源代码控制中获取它,那么问题就会消失.我也试过卸载并重新安装Visual Studio.这也有时候有所帮助.这两个人在某些时候工作的事实表明问题不是直接引起的.
在回答另一个用户的问题(TheSoftwareJedi)时出现了这个问题 ......
鉴于下表:
ROW_PRIORITY COL1 COL2 COL3
0 0.1 100 <NULL>
12 <NULL> <NULL> 3
24 0.2 <NULL> <NULL>
Run Code Online (Sandbox Code Playgroud)
以及以下查询:
select 'B' METRIC, ROW_PRIORITY,
last_value(col1 ignore nulls) over (ORDER BY ROW_PRIORITY) col1,
last_value(col2 ignore nulls) over (ORDER BY ROW_PRIORITY) col2,
last_value(col3 ignore nulls) over (ORDER BY ROW_PRIORITY) col3
from (SELECT * FROM ZTEST);
Run Code Online (Sandbox Code Playgroud)
我得到这些结果:
METRIC ROW_PRIORITY COL1 COL2 COL3
B 0 0.1 100 <NULL>
B 12 0.1 100 3
B 24 0.2 100 3
Run Code Online (Sandbox Code Playgroud)
预期:
METRIC ROW_PRIORITY …Run Code Online (Sandbox Code Playgroud) 我在两个不同的Oracle实例上使用两个不同的Oracle模式.我已经定义了几种类型和类型集合来在这些模式之间传输数据.我遇到的问题是,即使类型具有完全相同的定义(用于在模式中创建两个集的相同脚本),Oracle将它们视为不可互换的不同对象.
我想将传入的远程类型对象转换为相同的本地类型,但是我得到一个关于跨dblinks引用类型的错误.
基本上,我正在做以下事情:
DECLARE
MyType LocalType; -- note, same definition as the RemoteType (same script)
BEGIN
REMOTE_SCHEMA.PACKAGE.PROCEDURE@DBLINK( MyType ); -- MyType is an OUT param
LOCAL_SCHEMA.PACKAGE.PROCEDURE( MyType ); -- IN param
END;
Run Code Online (Sandbox Code Playgroud)
这失败是因为REMOTE过程调用无法理解MyType,因为它将LocalType和RemoteType视为不同的对象类型.
我也尝试了DECLARING MyType,如下所示:
MyType REMOTE_SCHEMA.RemoteType@DBLINK;
Run Code Online (Sandbox Code Playgroud)
但我得到另一个关于跨dblinks引用类型的错误.类型之间的CASTing也不起作用,因为为了进行强制转换,我需要跨dblink引用远程类型 - 同样的问题,同样的错误.我也尝试使用SYS.ANYDATA作为在两个实例之间穿过的对象,但它得到了类似的错误.
有任何想法吗?
更新:
尝试使用相同的OID(使用手动检索SYS_OP_GUID())在DBLINK的两侧声明对象类型,但Oracle仍然"看到"两个对象不同并抛出"错误数量或类型的争论"错误.
c# ×6
oracle ×3
sql ×2
.net ×1
add-on ×1
breakpoints ×1
collections ×1
dblink ×1
debugging ×1
dependencies ×1
dll ×1
ems ×1
events ×1
global-asax ×1
odp.net ×1
plsql ×1
reflection ×1
restart ×1
sharepoint ×1
smartclient ×1
sql-server ×1
tibco ×1
tibco-ems ×1
types ×1