有没有办法使用 ado.net 从 Sql 数据库中确定列的默认值?
我尝试使用SqlDataAdapter'sFillSchema方法:
using (SqlDataAdapter adapter = new SqlDataAdapter()) {
adapter.SelectCommand = myConnection.CreateCommand();
adapter.SelectCommand.CommandType = CommandType.Text;
adapter.SelectCommand.CommandText = "SELECT * FROM myTable";
DataTable table = new DataTable();
adapter.Fill(table);
adapter.FillSchema(table, SchemaType.Mapped);
}
Run Code Online (Sandbox Code Playgroud)
当我检查DataColumns中的 时DataTable,我可以确定一列是否为AutoIncrement,并且可以使用该AllowDBNull属性确定它是否允许空值。但是,DefaultValue(对于我知道有默认值的列)总是null.
我考虑过:
DataTable schemaTable = null;
using (SqlDataReader reader = adapter.SelectCommand.ExecuteReader(CommandBehavior.SchemaOnly)) {
schemaTable = reader.GetSchemaTable();
reader.Close();
}
Run Code Online (Sandbox Code Playgroud)
但DefaultValue不包含在架构中。
那么......我怎样才能得到一列的DefaultValue?
我知道如何使用C#和SMO在SQL Server上创建文件备份:
public void BackupDatabase(Microsoft.SqlServer.Management.Smo.Server server,
string databaseName, string backupFilename,
string backupName, string backupDescription) {
Backup backup = new Backup();
backup.Devices.AddDevice(backupFilename, DeviceType.File);
backup.Database = databaseName;
backup.Action = BackupActionType.Database;
backup.BackupSetDescription = backupDescription;
backup.BackupSetName = backupName;
backup.Incremental = false;
backup.LogTruncation = BackupTruncateLogType.Truncate;
backup.Initialize = true; // supposed to overwrite
backup.SqlBackup(server);
}
Run Code Online (Sandbox Code Playgroud)
我不知道(并且找不到)的是如何将文件BackupDevice添加到SQL服务器.
我需要使用以下代码重新编号表中的行,这些代码来自You've Been Haacked博客文章:
DECLARE @counter int
SET @counter = 0
UPDATE #myTable
SET @counter = ID = @counter + 1
Run Code Online (Sandbox Code Playgroud)
这可以很好地使用几个记录到几千个,但是当我在具有250K +记录的表上的SQL Server 2012(64位)实例上运行它时,我最终得到许多重复项(ID#1出现12次).总之,大约有27K条记录具有重复值.奇怪的是,大约19K有正好12个欺骗(我机器上的处理器数量相同).
重复的原因是什么?
我对编程非常陌生,事实上我现在正在尝试学习 Python 作为第一语言。我发现Google有一个python课程,它说要从python的网站下载python 2,我就这么做了,现在我意识到苹果已经在我的mac上安装了python。不管怎样,我还必须从谷歌下载一些练习,并尝试在终端中运行一些代码,这就是我遇到麻烦的地方,并且确实需要一些见解。
首先,课程中提到只需python在终端中输入 , 即可开始使用 python 进行编码(我不知道这是否是这样说的,或者这是否只是让您能够运行 python 代码?)
然后,它说输入:python hello.py
应该返回:Hello World
然而,我不断得到的是:
语法错误:语法无效
我真的不知道从这里到哪里去,我在想也许是因为我在已经安装了 python 的情况下再次下载了 python,如果是的话?
我使用以下代码更改服务器数据库的默认位置(SQL Server保留新数据库文件和日志文件的位置):
using Microsoft.SqlServer.Management.Smo;
Server smoServer = new Server(new ServerConnection(server, username, password));
server.DefaultFile = newPath;
server.Alter();
server.Refresh();
// Now create a database in the new location
Database smoDatabase = new Database(smoServer, database);
smoDatabase.Create();
smoServer.Refresh();
Run Code Online (Sandbox Code Playgroud)
这是我的问题:我可以查看SQL Server Management Studio,并看到数据库默认位置的服务器属性已更改为newPath.但是,当我使用SMO创建新数据库时,将在旧路径中创建新数据库和日志文件.
一旦我重新启动SQL Server实例,SMO代码就会在新路径中创建数据库/日志文件.
任何想法为什么我得到这种行为?
编辑:一个建议是,在重新启动Sql Server实例之前,实际上不会发生更改.但是,如果我打开SSMS并在实例上创建一个新数据库,它将在新路径中创建,而不必重新启动.
文件对话框必须打开关闭之前使用的最后一个目录位置,但我不知道如何执行此操作.我的同事只给我看了一个单词的例子,当你单击"文件"它显示最后使用的文件时,他告诉我使用寄存器或INI文件,这是我以前从未使用过的.
这是我正在使用的代码:
string f_sOudeLocatie = @"D:\path\is\classified";
private void btBrowse_Click(object sender, EventArgs e)
{
OpenFileDialog fdlg = new OpenFileDialog();
fdlg.Title = "Zoek de CSV file";
fdlg.InitialDirectory = f_sOudeLocatie;
fdlg.Filter = "All files (*.*)|*.*|All files (*.*)|*.*";
fdlg.FilterIndex = 1;
fdlg.RestoreDirectory = true;
if (fdlg.ShowDialog() == DialogResult.OK)
{
tbGekozenBestand.Text = fdlg.FileName;
tbVeranderNaamIn.Text = Path.GetDirectoryName(fdlg.FileName);
f_sOudeLocatie = Path.GetDirectoryName(fdlg.FileName);
f_sSourceFileName = fdlg.FileName;
f_sDestFileName = Path.GetFileName(Path.GetDirectoryName(fdlg.FileName)) + ".csv";
btOpslaan.Enabled = true;
tbVeranderNaamIn.ReadOnly = false;
}
}
Run Code Online (Sandbox Code Playgroud) 有没有办法禁用行大小的宽度调整DataGridView,而不设置AllowUserToResizeRows为False?
我发现了,row.HeaderCell.Resizable但它是只读的.
我正在使用数据网格,但这些值没有按照我希望的方式显示。我当前的代码如下,我将如何反转行?
string[] strOutput = strLine.Split('_', ',','=');
int totalRows = Convert.ToInt16(strOutput[4]);
int totalCols = Convert.ToInt16(strOutput[5]);
int itemIndex = 8;
for (int i = 0; i < totalCols; i++){
dataGridView1.Columns.Add("Col", "Col");
}
dataGridView1.Rows.Add(totalRows);
for (int i = 0; i < totalRows; i++) {
for (int j = 0; j < totalCols; j++) {
dataGridView1.Rows[i].Cells[j].Value = strOutput[itemIndex];
itemIndex += 2;
}
}
dataGridView1.Visible = true;
Run Code Online (Sandbox Code Playgroud)
我正在尝试从Windows 10-32或Windows 10-64位计算机上的VB-6应用程序中'shell osk.exe'。
在过去,我们仅使用:
Private Sub Command1_Click()
Dim strTemp As String
Dim fso1 As New FileSystemObject
strTemp = fso1.GetSpecialFolder(SystemFolder) & "\osk.exe"
Dim lngReturn As Long
Let lngReturn = ShellExecute(Me.hwnd, "Open", strTemp, vbNullString, "C:\", SW_SHOWNORMAL)
lblReturn.Caption = CStr(lngReturn)
end sub
Run Code Online (Sandbox Code Playgroud)
我们还使用了更简单的“ shell”命令。都不行。
在过去,这种方法效果很好。我们还可以从程序中打开NotePad,msPaint和其他实用程序。我们使用工业触摸屏PC,为方便起见,我们在“设置”页面上放置了一些按钮,以快速访问此类帮助程序。我不想等待该程序,我们的代码具有它自己的“触摸屏键盘”。用户仅在想要在我们的主应用程序之外执行某些工作时才使用Windows OSK。
对于Windows XP,所有这些程序都可以正常打开。现在,对于Windows 10,仅OSK.exe程序将无法启动。查看返回代码,返回的错误是“ 2”-找不到文件(我认为)。但是在c:\ windows \ system32文件夹中查找文件“ osk.exe”以及mspaint.exe和notepad.exe。
是否有一些Windows设置从我的程序中隐藏了真实的osk.exe?
感谢您的任何建议。
c# ×6
sql-server ×3
datagridview ×2
smo ×2
vb6 ×2
winforms ×2
.net ×1
ado.net ×1
exe ×1
macos ×1
python ×1
t-sql ×1
windows-10 ×1