Объявление импортированной функции неверно. Есть две ошибки:
Протестированный код:
public enum HRESULT : uint
{
S_FALSE = 0x0001,
S_OK = 0x0000,
E_INVALIDARG = 0x80070057,
E_OUTOFMEMORY = 0x8007000E,
E_INVALID_PRINTER_NAME = 0x80070709
}
[DllImport("Prntvpt.dll")]
public static extern HRESULT PTOpenProvider(
[MarshalAs(UnmanagedType.LPWStr)]string pszPrinterName,
uint dwVersion,
[Out] out IntPtr phProvider);
[DllImport("Prntvpt.dll")]
public static extern HRESULT PTCloseProvider(
IntPtr hProvider
);
private void button1_Click(object sender, EventArgs e)
{
var printerName = @"Fax";
IntPtr providerHandle;
HRESULT result = PTOpenProvider(printerName, 1, out providerHandle);
if(result == HRESULT.S_OK)
{
MessageBox.Show("OK. Handled obtained: " + providerHandle);
PTCloseProvider(providerHandle);
}
else
{
MessageBox.Show("Error: " + result);
}
}
Я думаю, получая доступ к схеме от запроса (через GetSchemaTable), единственный способ сделать это. Можно выполнить запрос, который не возвращает строк (выбор * от таблицы, где 1=2), если схема - все, чем Вы интересуетесь.
Необходимо использовать KeyInfo CommandBehaviour для выполнения исходного запроса, как иначе не, вся возвращенная информация, как гарантируют, будет точна
Command.ExecuteReader(CommandBehavior.KeyInfo)
Этот код сделает то, что Вы хотите (очевидно, изменяют имя таблицы, имя сервера и т.д.):
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
string query = "SELECT * FROM t where 1=0";
string connectionString = "initial catalog=test;data source=localhost;Trusted_Connection=Yes";
DataTable tblSchema;
using (SqlConnection cnn = new SqlConnection(connectionString))
{
using (SqlCommand cmd = cnn.CreateCommand())
{
cmd.CommandText = query;
cmd.CommandType = CommandType.Text;
cnn.Open();
using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.KeyInfo))
{
tblSchema = rdr.GetSchemaTable();
}
cnn.Close();
}
}
int numColumns = tblSchema.Columns.Count;
foreach (DataRow dr in tblSchema.Rows)
{
Console.WriteLine("{0}: {1}", dr["ColumnName"], dr["DataType"]);
}
Console.ReadLine();
}
}
}
SQL Server - запрашивает представления каталога... sysobjects, syscolumns и т.д. если SQL 2000 или ранее... sys.objects, sys.columns и т.д. если SQL 2005 или выше. (хотя более старые представления все еще доступны, желательно использовать более новые),
Полная ссылка здесь: http://msdn.microsoft.com/en-us/library/ms189783.aspx
Пример:
select so.name, sc.*
from sys.objects as so
inner join sys.columns as sc on sc.object_id = so.object_id
where so.name='some_table'